2013-06-22 166 views
0

我有另一篇文章更詳細的代碼,但我認爲我的問題在於以下邏輯。是否有可能有一個存儲過程,調用另一個存儲過程,並且被調用過程返回一個字符串用於第一個存儲過程?返回字符串與存儲過程

例子:

 ALTER PROCEDURE [dbo].[SP1] 
-- Add the parameters for the stored procedure here 
@output nvarchar(30) 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

Declare @SP2Input nvarchar(30) = 'Input'; 
Declare @SP2Output nvarchar(30); 

Execute @SP2Output = SP2 @SP2Input, @SP2Output; 

If @SP2Output = 'Success' 
Begin 
    Set @output = 'This worked'; 
End 
Else 
Begin 
    Set @output = 'This did not work'; 
End 

Select @output; 

END

這裏是下一個存儲過程:

 ALTER PROCEDURE [dbo].[SP2] 
-- Add the parameters for the stored procedure here 
@input nvarchar(30), 
@output nvarchar(30) out 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

If @input = 'Input' 
Begin 
    Set @output = 'Success'; 
End 
Else 
Begin 
    Set @output = 'Fail'; 
End 

Select @output; 

END 

那麼,什麼將得到恢復到任何調用存儲過程SP1?

Declare @output nvarchar(30); 

Execute SP1 @output; 

我會假設'這工作'會返回?但是,返回了兩個結果: 1)成功 2)這不起作用

我在做什麼錯?

+0

你能嘗試改變SP調用('執行@ SP2Output = SP2 @ SP2Input, @ SP2Output;')與[MSDN](http://msdn.microsoft.com/en-us/library/ms187004(v = sql.105).aspx)頁面上顯示的相似內容? – Caramiriel

+0

@ Caramiriel - 這工作。謝謝。 – user2511772

回答

0

有兩種方法可以從子過程獲取值:OUTPUT參數和返回值。

OUTPUT參數是其他語言稱爲參考參數的參數。如果傳入@variable,則可以使用它的值,但也可以在被調用的過程中進行更改。對於這個工作,你需要標記要像你這樣爲輸出參數爲這樣的過程的定義每個參數:

ALTER PROCEDURE [dbo].[SP2] 
    @input nvarchar(30), 
    @output nvarchar(30) OUT 
AS 
BEGIN 
.... 

但你還需要將其標記爲在每次調用的輸出:

EXECUTE dbo.SP2 @SP2Input, @SP2Output OUT; 

在你的例子中改變dbo.SP2的呼叫應該使它工作。

過程的實際返回值始終是一個整數。你在程序中使用return語句指定其值:

CREATE PROCEDURE dbo.SP3 
AS 
BEGIN 
    RETURN 42; 
END; 

然後,您可以使用這種方式:

DECLARE @ret INT; 
EXEC @ret = dbo.SP3; 
PRINT @ret; -- will print 42 
+0

我已將OUT關鍵字添加到通話中,但是,我仍然收到相同的兩個結果。思考? – user2511772

+0

您是否準確複製了我的代碼行,或者您是否只是將'OUT'添加到您的代碼中? –

+0

這裏是一個工作的SqlFiddle使用你的例子:http://sqlfiddle.com/#!6/f26a8/2/0 –