前些日子,有学生参加了一次神州数码招聘软件测试工程师的笔试.其中有道SQL题目把他难住了.
测试空间旗下大头针出品
题目如下:
写出一条Sql语句: 取出表A中第31到第40记录(SQLServer, 以自动增长的ID作为主键, 注意:ID可能不是连续的。)
其实这个题目到是不难,可能是有的学员不知道数据库里面有个游标机制罢了。
因为用SQL语句进行查询,最后的查询的结果都会返回一个结果集.不会返回一条一条的数据.而游标机智可以帮我们实现一条一条的得到数据.
废话多了直接看看下面一个简单的实现吧.
--创建了一个表,主键是job_id
DROP TABLE jobs
CREATE TABLE jobs
(
job_id smallint IDENTITY(1,2),
job_name varchar(50) NOT NULL,
PRIMARY KEY(job_id)
)
--循环插入了8条数据,只是模拟一下.
insert into jobs(job_name)
values('tester1')
insert into jobs(job_name)
values('tester2')
insert into jobs(job_name)
values('tester3')
insert into jobs(job_name)
values('tester4')
insert into jobs(job_name)
values('tester5')
insert into jobs(job_name)
values('tester6')
insert into jobs(job_name)
values('tester7')
insert into jobs(job_name)
values('tester8')
--查看插入后jobs表的内容
select * from jobs
--到此,准备工作作完了,当然这个不需要写到面试题里.
--下面是面试题目中应该写的.
--我选择显示第5,6,7条查询结果,不是31到40条,其实原理一样.
--声明三个局部变量
declare @job_id smallint
declare @job_name varchar(50)
declare @table_length smallint
--控制循环次数
set @table_length=5
--声明游标 其中scroll:随意移动游标 dynamic:读写游标
declare sele_cursor cursor scroll dynamic for select * from jobs
--打开游标
open sele_cursor
--定位到第5条记录
fetch relative 5 from sele_cursor into @job_id,@job_name
--循环三次,输出5,6,7条记录
while(@table_length<=7)
begin
select @job_id ,@job_name
fetch next from sele_cursor into @job_id,@job_name
set @table_length=@table_length+1
end
--关闭游标
close sele_cursor
--删除游标资源
deallocate sele_cursor
go
--最后的结果
文章引用自: