我有另一篇帖子有更详细的代码,但我认为我的问题在于以下逻辑。是否可以有一个存储过程,调用另一个存储过程,并且被调用过程返回一个字符串以在第一个存储过程中使用?
示例:
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 :(得分: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