2013-06-22 2 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, его значение может быть использовано, но также изменено в вызываемой процедуре. Для этой работы необходимо отметить каждый параметр, который вы хотите быть параметр OUTPUT как таковой в определении процедуры, как вы делали:

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

Но вы также должны пометить его как выход на каждом вызове:

EXECUTE dbo.SP2 @SP2Input, @SP2Output OUT; 

Изменение вызов dbo.SP2 в вас пример, чтобы это должно заставить его работать.

Фактическое возвращаемое значение процедуры всегда является целым числом. Необходимо указать свое значение с обратным заявлением в порядке:

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 –