2008-10-17 163 views
21

在存儲過程中,另一個存儲過程在遊標內被調用。對於每次調用,SQL Management Studio結果窗口都顯示結果。遊標循環超過100次,結果窗口放棄了錯誤。有沒有辦法阻止光標內的存儲過程輸出任何結果?如何從存儲過程執行存儲過程時禁用查詢結果?

WHILE @@FETCH_STATUS = 0 
    BEGIN 
    EXEC @RC = dbo.NoisyProc 
    SELECT @RValue2 = 1 WHERE @@ROWCOUNT = 0 
    FETCH NEXT FROM RCursor INTO @RValue1, @RValue2 
    END 

謝謝!

+0

你確定你需要使用遊標嗎?目前這些不應該是SQL Server的首選。事實上,許多專家都厭惡他們。 – DOK 2008-10-17 16:37:36

+0

請在這裏發佈您收到的錯誤。 – 2008-10-17 18:32:25

回答

14

,你可以將結果插入到一個臨時表,然後刪除臨時表

create table #tmp (columns) 

while 
    ... 
    insert into #tmp exec @RC=dbo.NoisyProc 
    ... 
end 
drop table #tmp 

否則,您可以修改被調用來接受一個標誌,告訴它不輸出結果集的PROC?

•在查詢窗口
•選擇「查詢選項」
•單擊「結果」右鍵單擊:

+0

我正在重新使用web應用程序使用的可重用導入程序,所以我無法更改proc的任何行爲。這只是件事。 – 2017-04-05 21:00:20

0

地點:

SET ROWCOUNT OFF 
/* the internal SP */ 
SET ROWCOUNT ON 

包裝,圍繞內部SP,或者你甚至可以做到這一點從周圍原始查詢的SELECT語句,這將防止出現結果。

+0

我試過但收到錯誤。我也嘗試過繞過SET ROWCOUNT 1和SET ROWCOUNT 0,但沒有成功。 – 2008-10-17 15:46:54

+0

我相信這適用於SQL Server 2005及更高版本。如果您使用的是SQL 2000,請參閱Estanislao的回覆。 – RLH 2011-10-18 14:56:56

+2

SET ROWCOUNT的語法是 SET ROWCOUNT {number | @number_var}。它不會將ON/OFF作爲參數。 – Tony 2014-10-18 22:33:44

29

您可以通過以下步驟,2005年 丟棄在SQL Server管理Studio中的結果集在左側面板樹視圖「節點」的形式中心/右
•檢查「放棄執行後的結果」

,您可以嘗試在

DECLARE @i int 
SET @i = 1 
WHILE (@i <= 100) 
    BEGIN 
    SELECT @i as Iteration 
    SET @i = @i + 1 
    END 

3

光標壞。如果這意味着您必須使用遊標執行基於集合的函數,則不要重用存儲的proc代碼。更好的性能是以基於集合的方式編寫代碼。

我想我擔心你更關心抑制消息,而不是你在遊標中出現錯誤。

1

可能錯誤來自太多的記錄集被返回,而不是SP或遊標本身的邏輯缺陷。請看下面的例子:

DECLARE @I INT 
SET @I=0 
WHILE @I<200 BEGIN 
    SELECT * FROM INFORMATION_SCHEMA.TABLES 
    SET @I = @I + 1 
END 

將運行次數(略多於100)然後失敗:

查詢已超過可顯示在結果集的最大數量結果網格。只有前100個結果集顯示在網格中。

SSMS對它可以顯示的記錄集數量有限制。 繞過該限制的一個快速方法是按Ctrl + T(或菜單查詢 - >結果 - >結果到文本)以強制輸出爲純文本而不是表格式記錄集。你最終會達到另一個限制(結果窗口不能處理無限的文本輸出),但它會更大。

在上面的示例中,將結果更改爲文本形式後,您不會收到錯誤消息!

9

我知道這個問題是舊的,但您可以設置SET NOCOUNT ON以防止SP爲每一行輸出消息。