存储过程如下:
WHILE( 1=1 )
begin
Begin Try
Begin Transaction
Update RIS.dbo.A
set registerid_with_number = CDRDB_VIEW.DBO.ONLY_GET_Number(hisexamineid)
where registerid IN (
SELECT TOP 10000 registerid
FROM RIS.dbo.A
WHERE registerid_with_number IS NULL
)
PRINT '更新一次'
--全部更新完后,退出
if @@rowcount = 0
begin
COMMIT Transaction
PRINT '最后提交一次'
BREAK
end
COMMIT Transaction
PRINT '提交一次'
waitfor delay '00:00:01' --睡眠1秒,避免锁表
End Try
Begin Catch
.........................--省略
运行该过程,每次第一次就退出了,print @@rowcount的值,每次都是0,update明明影响了1万行,怎么可能受影响的行数为0呢? 刚开始以为是SQL SERVER自动提交刷新了受影响的行,改为手动提交后,依然@@rowcount一致为0
最终:
@@rowcount不仅代表Insert,Update,Delete,Select返回的行,其它语句的行,它也记录。
我在中间print '更新一次' 就重置了@@rowcount,所以一直为0
解决方法:
将@@rowcount紧跟在需检测SQL语句下一行,不被任何语句重置即可。
Update RIS.dbo.A
set registerid_with_number = CDRDB_VIEW.DBO.ONLY_GET_Number(hisexamineid)
where registerid IN (
SELECT TOP 10000 registerid
FROM RIS.dbo.A
WHERE registerid_with_number IS NULL)
--全部更新完后,退出
if @@rowcount = 0
begin
COMMIT Transaction
--PRINT '最后提交一次'
BREAK
END