2009-03-03 146 views
10

我想我遇到了與kcrumley在問題「Problem calling stored procedure from another stored procedure via classic ASP」中描述的相同的問題。但是他的問題並沒有真正包括解決方案,所以我給它一個鏡頭,加上我自己的觀察:MS SQL:抑制存儲過程中調用的存儲過程的返回值

我有兩個存儲過程:

CREATE PROCEDURE return_1 AS BEGIN 
    SET NOCOUNT ON; 
    SELECT 1 
END 

CREATE PROCEDURE call_return_1_and_return_2 AS BEGIN 
    SET NOCOUNT ON; 
    EXEC return_1 
    SELECT 2 
END 

注意,這兩個程序包含「SET NOCOUNT ON 」。當我執行「call_return_1_and_return_2」時,我仍然得到兩個記錄集。首先是值1,然後是值2.

這會導致ASP(經典的VBScript ASP)離開軌道。

任何提示我如何能抑制第一個結果集?爲什麼即使使用NOCOUNT,它也存在?

跳過ASP中的第一個記錄集不是一個選項。我需要一個「僅數據庫」解決方案。

+0

一對夫婦的響應指出,可以從選擇更改來一回,但是這是一個很大的問題 - 如果嵌套的存儲過程必須選擇,因爲別的東西的話來說,你不能改變它?我想知道是否有可能「吞下」這樣的結果集。 – 2009-03-03 11:34:41

回答

8

它不是導致這種情況的NOCOUNT,您的存儲過程每個都有一個選擇,因此每個都有自己的結果集。這可以通過更改第一個存儲過程以避免使用輸出參數將數字1傳回而不是執行選擇來避免。第二個存儲過程可以檢查輸出參數以獲取運行所需的數據。

嘗試這樣的事情

CREATE PROCEDURE Proc1 
(
    @RetVal INT OUTPUT 
) 
AS 
SET NOCOUNT ON 
SET @RetVal = 1 


CREATE PROCEDURE Proc2 
AS 
SET NOCOUNT ON 
DECLARE @RetVal int 
EXEC [dbo].[Proc1] 
     @RetVal = @RetVal OUTPUT 
SELECT @RetVal as N'@RetVal' 
2

那些不返回變量,但輸出記錄集。我猜,只要SQL服務器將輸出刷新到客戶端,就會被搞砸,無法收回。

我會通過向SP return_1添加一個參數來解決這個問題,這將控制return_1是否選擇記錄或者只是執行某些操作並以靜默方式退出。

12

正如馬特在他的評論中指出的那樣,這兩種解決方案都不能真正「吞下」第一個結果集。 我不知道你爲什麼想要這個,但是你可以通過使用一個表變量'吞下'第一個exec的結果。它必須匹配結果集列的確切數量和類型。像這樣:

CREATE PROCEDURE return_1 AS 
    SET NOCOUNT ON; 
    SELECT 1 
GO 
CREATE PROCEDURE call_return_1_and_return_2 AS 
    SET NOCOUNT ON; 
    DECLARE @Result TABLE (res int) 
    insert into @Result EXEC return_1 
    SELECT 2 
GO