iT邦幫忙

2

關於在SQL Server預存程序裡使用 @@ROWCOUNT 須注意

sql
player 2010-11-02 17:47:5812555 瀏覽

近日, 我改寫了一個以前寫的SQL預存程序,
準備加上自行紀錄Log的功能 (判斷insert 或 update是否成功, 然後在放log的 table裡 insert 1筆新的log)

可是
因為這隻SQL預存程序
裡頭寫了一堆 if 以及有用到一些 select 在insert 或 update之前
所以
當我把
if (@@ROWCOUNT > 0)
begin
-- insert log的相關語法
end

放在該SQL預存程序最後的 end 之前時
竟然只有最後1個 if 區塊內的 insert 或 update 才抓得到 @@ROWCOUNT ?

這個問題發生在 SQL Server 2005 Express
於是
只好多加1個變數
DECLARE @IsOutLog AS int;

set @IsOutLog = 0;

並在每一個 insert 或 update 之後, 都加上
if (@@ROWCOUNT > 0)
set @IsOutLog = 1;

以保留做為判斷是否寫log的依據

這樣才終於使SQL預存程序達到預期的效果

謎啊?
明明我是用一堆if 區塊去做 功能區分的
在 insert 或 update 之後, 就沒有再做任何的 select 或 insert 或 update
為何 @@ROWCOUNT 的值還會被影響到?


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
otis
iT邦新手 5 級 ‧ 2010-11-03 08:52:38

@@ROWCOUNT 偵測是否有資料列已被變更,所以前面有UPDATE敘述,值才會+1。

0
player
iT邦大師 1 級 ‧ 2010-11-03 17:43:50

otis提到:
@@ROWCOUNT

這個在 insert 或 update 之後
應該是計算出受影響的資料筆數

所以原本的作用是判斷資料是否正常插入或更新

可是在SQL預存程序裡
不知道是不是受到 if 區塊的影響 ( begin 與 end )
導致這個@@ROWCOUNT 的值?

我要留言

立即登入留言