我有以下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
虽然上述解决方案可行,但有没有更好的方法来解决问题?渴望了解更多,谢谢!
答案 0 :(得分:3)
您的问题不是@@ROWCOUNT
。它是:
update top 1000 @Table_name
set columnA = 'haha';
如果在循环中运行它,它将反复设置相同的行。也许你应该使用:
update top 1000 @Table_name
set columnA = 'haha'
where columnA <> 'haha';