【问题标题】:Return Output Param of a Stored Procedure inside another Stored Procedure在另一个存储过程中返回一个存储过程的输出参数
【发布时间】:2012-02-15 09:25:44
【问题描述】:

我试图找出在另一个存储过程中执行存储过程时如何返回存储过程的输出参数:

 CREATE PROCEDURE Test1

 EXEC SpWithOutputID -- Outputs @ID

 SELECT @ID as ID -- Output @ID now being used in this SP

这当然不是我的代码,只是一个例子,是否可以这样做?

示例 2: --这里@ID返回Null

 CREATE PROCEDURE Test1
 As 
 DECLARE @ID int

 EXEC SpWithOutputID @ID = @ID OUTPUT -- Outputs @ID

 SELECT @ID as ID -- Output @ID now being used in this SP

示例 3: --这里@ID返回一个Int

 CREATE PROCEDURE Test1
 As 

 EXEC SpWithOutputID -- Outputs @ID

【问题讨论】:

  • 您需要澄清... SpWithOutputID 中的 @ID 是实际的 OUTPUT 参数,还是像最后一行一样选择?差别很大,术语很重要。
  • sp 没有OUTPUT 参数,但它仍然输出一个值,所以我想我必须给 SpWithOutputID 一个输出参数,我明白了。再次感谢亚伦,没有你我该怎么办..? =]
  • 您需要显示您希望在SpWithOutputID 中运行的代码。您还应该澄清这个问题,因为您的大多数读者对output param 的定义不同。如果您需要返回单个标量值,那么您应该让内部 SP 返回一个 OUTPUT 参数,而不是结果集。

标签: sql-server sql-server-2008 tsql


【解决方案1】:

如果这根本不是一个真正的输出参数问题,而是一个结果集,那么猜测SpWithOutputID 做了这样的事情(返回一个带有单行单列的SELECT):

CREATE PROCEDURE dbo.SpWithOutputID
AS
BEGIN
    SET NOCOUNT ON;

    SELECT ID = 4;
END
GO

那么Test1 可能看起来像这样:

CREATE PROCEDURE dbo.Test1
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @ID INT;

    CREATE TABLE #x(ID INT);

    INSERT #x EXEC dbo.SpWithOutputID;

    SELECT TOP (1) @ID = ID FROM #x;

    DROP TABLE #x;
END
GO


但这在你看来不是很乱吗?对于单个标量值,它确实应该以这种方式工作:

CREATE PROCEDURE dbo.SpWithOutputID
    @ID INT OUTPUT 
AS
BEGIN
    SET NOCOUNT ON;

    SELECT @ID = 4; 
END 
GO

现在使用真正的输出参数要简单得多:

CREATE PROCEDURE dbo.Test1
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @ID INT;

    EXEC dbo.SpWithOutputID @ID = @ID OUTPUT;

    SELECT @ID;
END
GO

【讨论】:

  • 在 dbo.Test1 中,你不需要声明 @ID 吗?它真的有效吗,因为我在这里得到了一个 NULL 值。
  • 抱歉,已更正。当您让我相信您正在使用输出参数时,我从上一个示例中抓住了这一点......
  • 是的,它有效。 yfrog.com/kja44p为什么你会接受答案然后问它是否有效?
  • 好吧,就是这样,但是 @ID 在 Test1 中返回 NULL,但是当我在没有任何参数的情况下运行 SpWithOutputID 时,我得到了正确的 @ID 返回。嗯...
  • 我不明白,抱歉。您的查询与我在屏幕截图中显示的有什么不同?你的描述听起来跟我相反。如果你在没有任何参数的情况下运行SpWithOutputID,那么你将无法在@ID 中获得任何值dbo.Test1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 2020-03-09
  • 2014-09-17
相关资源
最近更新 更多