@@ERROR @@ROWCOUNT 返回的都是上一條SQL 語句後的執行信息

 

比如下面的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
HELLO,你好!
我剛好也有個問題,用BAIDU搜索就找到你的這篇文章,@@ERROR可以撲捉到錯誤,但是你的前面有錯誤的語句在SQL不能通過,比如很明顯的錯誤,例如要插入的表已經不存在或者欄位沒有指定值,不能爲空,SQL SERVER的查詢編譯器沒有到你的IF @@ERROR就報錯,那麼根本談不上用到出錯就ROLLBACK,你覺得有辦法解決嗎?

# re: @@ERROR @@ROWCOUNT 返回的都是上一條SQL 語句後的執行信息。

2005-7-25 17:36 by ghj1976
程序外部撲作。

沒有執行到@@ERROR就報錯,那都是嚴重的SQL 錯誤,不應該用@@ERROR 來樸捉。

# re: @@ERROR @@ROWCOUNT 返回的都是上一條SQL 語句後的執行信息。

2005-7-26 9:15 by MORNING TEA
嗯,問完後覺得自己好像咬爛自己的嘴巴,又問了一個蠢問題:P
謝謝回覆!
@@ERROR一直讓我有點頭痛,我對ERROR看的太膚淺,有個vb系統,裏面很多這樣的嵌套
On Error GoTo errHandle
DBConn.BeginTrans
...commit....
errHandle:
UpdateDYWhenDelCS = "Error #" & Err.Number & ": " & Err.Description
DBConn.RollbackTrans
很可惜,也是經常沒有友好報錯就over啦,因爲裏面有單引號的問題,如果處理過程中有循環,更可怕,好像有rollback,但是隻是部門,令我一直很擔心

# re: @@ERROR @@ROWCOUNT 返回的都是上一條SQL 語句後的執行信息。

2005-9-16 16:39 by pyd
非常感謝!我找了半天才找到,感謝高人的提點!

# re: @@ERROR @@ROWCOUNT 返回的都是上一條SQL 語句後的執行信息。

2005-11-18 20:02 by jojo
路過,路過
看起來不錯

# re: @@ERROR @@ROWCOUNT 返回的都是上一條SQL 語句後的執行信息。

2006-7-18 16:31 by 123

# re: @@ERROR @@ROWCOUNT 返回的都是上一條SQL 語句後的執行信息。

2006-10-4 15:44 by DAAN
獲取行數可以使用@@CURSOR_ROWS ,就沒有這個限制了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章