IF语句中断了T-SQL中的ROWCOUNT

时间:2016-01-08 21:25:29

标签: sql sql-server tsql

我有以下T-SQL 伪代码查询

SET @Loop = 1
WHILE @Loop > 0
BEGIN
 IF (@Table_name = 'abcdef')
    BEGIN 
       SET @SqlCmd = 'update top 1000 @Table_name
                      set columnA = ''haha'''
    END
 ELSE
    BEGIN
       SET @SqlCmd = 'update top 1000 @Table_name  
                      set columnA = ''hehe'''
    END

 EXEC dbo.sp_executesql @SqlCmd
 SET @Loop = @@RowCount
END

现在,假设@Table_name(abcdef和另一个)都有5000条记录,“ELSE”子句中的update语句只运行5次并退出循环。但是,“IF”子句中的update语句会陷入无限循环。我相信原因是@@ RowCount被IF中断(@Table_name ='abcdef')。因为@@ RowCount在该块内运行时总是返回1。

我有一个快速(但非常难看)的解决方案如下:

SET @Loop = 1
WHILE @Loop > 0
IF (@Table_name = 'abcdef')
   BEGIN 
     SET @SqlCmd = 'update top 1000 @Table_name
                    set columnA = ''haha'''

     SELECT @Loop = COUNT(1) FROM @Table_name WHERE columnA != 'haha'
   END
ELSE
   BEGIN
     SET @SqlCmd = 'update top 1000 @Table_name  
                    set columnA = ''hehe'''
     SET @Loop = @@RowCount
   END

 EXEC dbo.sp_executesql @SqlCmd
END

虽然上述解决方案可行,但有没有更好的方法来解决问题?渴望了解更多,谢谢!

1 个答案:

答案 0 :(得分:3)

您的问题不是@@ROWCOUNT。它是:

update top 1000 @Table_name
     set columnA = 'haha';

如果在循环中运行它,它将反复设置相同的行。也许你应该使用:

update top 1000 @Table_name
     set columnA = 'haha'
     where columnA <> 'haha';