2012-05-08 86 views
1

我已經簡化爲下面的代碼的存儲過程:覆蓋行數量的影響返回使用遊標內

SET NOCOUNT ON 

DECLARE @count INT 
DECLARE @temp TABLE 
INSERT INTO @temp 
SELECT @count = count(*) FROM @temp 

DECLARE [cursor] FOR SELECT id FROM @temp 
OPEN [cursor] FETCH NEXT FROM [cursor] INTO @id WHILE @@fetch_status = 0 
BEGIN 
    exec anoterStoredProc @id 
FETCH NEXT FROM [cursor] INTO @id 
END 
CLOSE [cursor] 
DEALLOCATE [cursor] 

SET NOCOUNT OFF 

RETURN @count 

ExecuteNonQuery()仍然返回-1!

我可以使用select @countExecuteScalar(),但要理解爲什麼我的代碼不起作用。

似乎NOCOUNT OFF不會重置服務器行爲,並且NOCOUNT ON仍在原地。

回答

3

首先,不要弄亂SET ROWCOUNT - 做一些非常危險的事情(如果使用不正確)。

返回值實際上是通過添加一個帶有「方向」的ReturnValue參數來處理的。或者,選擇該值,並使用ExecuteScalar。

+0

所以無論ExecuteScalar()或方向=返回和讀者它的價值,沒有什麼已經被ExecuteNonQuery()返回,right – abatishchev

+0

@abatishchev沒有*返回* ExecuteNonQuery - 然而,任何out/ref/return -value參數將在原地更新,因此在調用之後,您可以從該參數獲得'.Value' –

1

SET ROWCOUNT xx用於限制所有後續查詢返回的行數。它不會用於返回標量值。

RETURN xx用於向調用該過程的進程返回一個整數值。通常這用於表示成功(零)或失敗(不是零,大概是錯誤號)。對於特定的值,您可能會發現輸出參數更方便。

[新增] SET NOCOUNT是一個斜命令。關閉時,將爲每個查詢運行返回信息(選擇,更新,插入,刪除);當打開時,它不是。 (因此,將它設置在你做的地方不起作用。)問題是,這個信息不是返回值,參數值或數據集,而是其他的東西(它是一個數字?一個字符串?米不確定)。從我聽過的所有內容開始看起來很痛苦,這就是爲什麼我總是用SET NOCOUNT on開始我的存儲過程。

在這兩種情況下,我都沒有看到@count被定義或賦值的位置。

+0

我已更新瞭如何填充@count – abatishchev

+0

返回x是否影響由ExecuteNonQuery返回的值( )'? – abatishchev

+0

我對ado.net的回答不夠熟悉。我會和@Marc Gravell的建議(+1)一起使用帶有「ReturnValue」的參數。而且我正在更新提到SET NOCOUNT的答案。 –