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;

结尾

这是下一个存储过程:

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

我究竟做错了什么?

4

1 回答 1

3

有两种方法可以从子过程中取回值: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
于 2013-06-22T17:55:11.507 回答