2012-02-15 188 views
0

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

CREATE PROCEDURE Test1 

EXEC SpWithOutputID -- Outputs @ID 

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

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

实施例2: --Here @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: --Here @ID返回int

CREATE PROCEDURE Test1 
As 

EXEC SpWithOutputID -- Outputs @ID 
+0

你需要澄清......是'SpWithOutputID'中的'@ ID'是一个实际的'OUTPUT'参数,还是像最后一行那样被选中?差别很大,术语很重要。 – 2012-02-15 00:59:32

+0

sp没有'OUTPUT'参数,但它仍然输出一个值,所以我想我必须给SpWithOutputID一个输出参数,我明白了。再次感谢亚伦,没有你,我会做什么......? =] – 2012-02-15 01:01:24

+0

您需要显示您希望在'SpWithOutputID'内运行的代码。你也应该澄清这个问题,因为你对大多数读者的'output param'有不同的定义。如果你需要返回一个标量值,那么你应该让内层SP返回一个'OUTPUT'参数,而不是结果集。 – 2012-02-15 01:04:47

回答

3

如果这不是一个真正的输出参数问题,而是一个结果集,然后猜测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 
+0

在dbo.Test1中,你不需要声明@ID吗?它实际上工作,因为我在这里得到一个NULL值。 – 2012-02-15 01:12:47

+0

对不起,改正了。当我让你相信你正在使用一个输出参数时,我抓住了前面的例子... – 2012-02-15 01:13:53

+0

是的,它的工作原理。 http://yfrog.com/kja44p为什么你会接受答案,然后问它是否有效? – 2012-02-15 01:15:35