比如下面的SQL 語句:
select EmployeeID from employees -- 這條SQL 語句返回9條記錄
print(@@error)
print(@@ROWCOUNT)
返回的結果是:
(9 row affected)
0
0
而
select EmployeeID from employees -- 這條SQL 語句返回9條記錄
print(@@ROWCOUNT)
print(@@error)
返回的結果是:
(9 row affected)
9
0
原因,後一個打印出來的是前一個print 執行後的對應變量的結果。
如果想在一個語句執行後,即獲得 @@ROWCOUNT 也獲得 @@error,需要用一個SQL 語句把它們讀出來:
declare @a int ,@b int
select EmployeeID from employees -- 這條SQL 語句返回9條記錄
select @a = @@ROWCOUNT,@b = @@error
print(@a)
print(@b)
在這個一句讀取數據中,先取那個都無所謂。也就是 select @b = @@error,@a = @@ROWCOUNT 也可以。但是必須是一句,如果變成兩句,就又有上面的問題了。
declare @a int ,@b int
select EmployeeID from employees -- 這條SQL 語句返回9條記錄
select @b = @@error
select @a = @@ROWCOUNT
print(@a)
print(@b)
返回結果:
(9 row affected)
1
0
declare @a int ,@b int
select EmployeeID from employees -- 這條SQL 語句返回9條記錄
select @a = @@ROWCOUNT
select @b = @@error
print(@a)
print(@b)
返回結果:
(9 row affected)
9
0
今天的一個Bug 就跟這個有關,找了很久,才發現是這裏的原因。 SQL 說明書中寫得很清楚,就是沒注意。
反饋
# re: @@ERROR @@ROWCOUNT 返回的都是上一條SQL 語句後的執行信息。
2005-7-25 17:33 by MORNING TEA我剛好也有個問題,用BAIDU搜索就找到你的這篇文章,@@ERROR可以撲捉到錯誤,但是你的前面有錯誤的語句在SQL不能通過,比如很明顯的錯誤,例如要插入的表已經不存在或者欄位沒有指定值,不能爲空,SQL SERVER的查詢編譯器沒有到你的IF @@ERROR就報錯,那麼根本談不上用到出錯就ROLLBACK,你覺得有辦法解決嗎?
沒有執行到@@ERROR就報錯,那都是嚴重的SQL 錯誤,不應該用@@ERROR 來樸捉。
# re: @@ERROR @@ROWCOUNT 返回的都是上一條SQL 語句後的執行信息。
2005-7-26 9:15 by MORNING TEA謝謝回覆!
@@ERROR一直讓我有點頭痛,我對ERROR看的太膚淺,有個vb系統,裏面很多這樣的嵌套
On Error GoTo errHandle
DBConn.BeginTrans
...commit....
errHandle:
UpdateDYWhenDelCS = "Error #" & Err.Number & ": " & Err.Description
DBConn.RollbackTrans
很可惜,也是經常沒有友好報錯就over啦,因爲裏面有單引號的問題,如果處理過程中有循環,更可怕,好像有rollback,但是隻是部門,令我一直很擔心