代码改变世界

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

2012-05-11 15:27  十行[Arist]  阅读(1317)  评论(0编辑  收藏  举报

  一个数据集 ,假设是 一个表结构,可以自定义创建表变量,在这里用 临时表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