存儲過程如下:
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