返回带存储过程的字符串

时间:2013-06-22 16:50:16

标签: string tsql stored-procedures return-value

我有另一篇帖子有更详细的代码,但我认为我的问题在于以下逻辑。是否可以有一个存储过程,调用另一个存储过程,并且被调用过程返回一个字符串以在第一个存储过程中使用?

示例:

      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)这不起作用

我做错了什么?

1 个答案:

答案 0 :(得分: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的调用更改为此应该可以使其正常工作。

过程的实际返回值始终为整数。您可以使用过程中的return语句指定其值:

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

然后您可以这样使用它:

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