您的位置:首页 > 数据库

sql 中 遍历数据集 处理方法一(非游标)

2012-05-11 15:27 197 查看
一个数据集 ,假设是 一个表结构,可以自定义创建表变量,在这里用 临时表temp1.

--
declare
@FSn           as nvarchar(50),
@FStatus            as int,
@FSErrorstr        as nvarchar(100)

while exists(select FSn from #temp1)
  begin
    Set RowCount 1
    select @FSn = fsn from #temp1
    select @FStatus=FStatus from t1 where FSn=@FSn
    if @FStatus=0
      begin
        set @FSErrorstr= ' number :'+ @FSN +' is not a qualified,please check!'
        RAISERROR(@FSErrorstr,18,18)
      end
    SET ROWCOUNT 0
    delete from #temp1 where FSn= @FSn
  end

IF OBJECT_ID('Tempdb..#temp1') is not null  
  BEGIN
    drop table #temp1
  END


先判断临时表数据集中有没有数据,再借用 Set RowCount 1 功能 查询出一行 ,然后进行需要的逻辑处理,例中主要是查表中序列号,当该序列号的状态为0时,

将会报出错误.反之无问题,逻辑判断完成;最后执行Set RowCount 0 以便返回所有的行(也就是将此功能设置为 off ),然后从该数据集中删出该条查询记录;

接着又进行while判断继续相同逻辑处理.(当然数据集中要保证 FSn为主键或唯一标识值,否则最后一步删除可能会删除有同样FSn的记录,以致功能缺陷. 在此想到:在执行deleted之后再执行Set RowCount 0 是否可以解决此问题,因为还未执行Set RowCount 0前还受执行sql只影响一行的作用,执行delete可以确保此操作对象是查询的数据记录; 这个语法在不久之后的版本将不再支持,所以尽量不采用Set RowCount功能,类似功能有top .在此不细讲.)

PS:此次主要是说说有些情况下可以不用游标来处理这种遍历问题,由于sql只是刚了解,在实际项目中很大可能碰到这种情况,以往一直用到游标,在数据量较大时,会影响处理效率;记录着这种处理方法,可以帮助自己以后碰到类似问题快速处理,毕竟好记忆不如烂笔头.o(∩_∩)o
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: