[SQL]使用@@ROWCOUNT全域變數要注意的地方!

[SQL]使用@@ROWCOUNT全域變數要注意的地方!

前言

@@ROWCOUNT,傳回受到前一個陳述式所影響的資料列數。如果資料列的數目超過 20 億,請使用 ROWCOUNT_BIG。(From SQL HELP 說明)

練習1

請看以下的SQL語法,那個字會PRINT出來呢?

IF @@ROWCOUNT = 0
BEGIN
    PRINT '@@ROWCOUNT = 0'
END
--因為執行IF,所以@@ROWCOUNT的值被改成了0
IF @@ROWCOUNT > 0
BEGIN
    PRINT '@@ROWCOUNT > 0'
END

 

您可能會以為是”@@ROWCOUNT > 0”,但事實上,PRINT都不會被執行到!

image

因為在執行IF @@ROWCOUNT = 0這個陳述式,因為都沒有影響任何資料,所以@@ROWCOUNT就被改成了0。所以接下來@@ROWCOUNT就不會>0,所以也就不會執行>0內的指令。

練習2

那我們再將SQL改一下呢? 改將ELSE時再去判斷OK嗎? ”@@ROWCOUNT > 0”會被印出來嗎?

--顯示目前@@ROWCOUNT值為1
IF @@ROWCOUNT = 0
BEGIN
    PRINT '@@ROWCOUNT = 0'
END
ELSE
BEGIN
    PRINT '@@ROWCOUNT > 0'
END

因為只判斷一次,所以PRINT '@@ROWCOUNT > 0'是會被執行到!

image 

結論

如果要拿某次的@@ROWCOUNT來判斷的話,只能判斷一次,如果要判斷多次的話,就要先把@@ROWCOUNT的值存到LOCAL變數,再去判斷這個LOCAL變數,才不會每RUN一個SQL,就會影響到@@ROWCOUNT的值。

SELECT GETDATE()  --目前日期
SET @CNT = @@ROWCOUNT 
IF @CNT = 0
BEGIN
    PRINT '@@ROWCOUNT = 0'
END
IF @CNT > 0
BEGIN
    PRINT '@@ROWCOUNT > 0'
END

image

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^