【问题标题】:Return String with Stored Procedure返回带有存储过程的字符串
【发布时间】:2013-06-19 15:18:00
【问题描述】:

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

例子:

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

我做错了什么?

【问题讨论】:

  • 您能否尝试使用MSDN 页面上显示的类似内容更改 SP 调用 (Execute @SP2Output = SP2 @SP2Input, @SP2Output;)?
  • @Caramiriel - 这行得通。谢谢。

标签: string tsql stored-procedures return-value


【解决方案1】:

有两种方法可以从子过程中取回值: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

【讨论】:

  • 我已将 OUT 关键字添加到调用中,但是,我仍然收到相同的两个结果。想法?
  • 您是否完全复制了我的行,或者您只是将OUT 添加到您的代码中?
  • 这是一个使用您的示例的工作 SqlFiddle:sqlfiddle.com/#!6/f26a8/2/0
猜你喜欢
  • 2012-01-09
  • 2011-10-19
  • 2016-05-07
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 2014-10-20
  • 1970-01-01
相关资源
最近更新 更多