在Sql Server 2008中如何在调用存储过程时使用嵌套存储过程的结果

8

能否在一个存储过程中使用另一个存储过程的结果?

例如:

CREATE PROCEDURE [dbo].[Proc1]
        @ID INT,
        @mfgID INT,
        @DealerID INT

AS
BEGIN

    DECLARE @Proc1Result UserDefinedTableVariable

    EXEC @Proc1Result = Proc2
        @SomeID = @ID,
        @SomeID2 = @mfgID,
        @SomeID3 = @DealerID

    -- Now I want to use the table returned by the stored procedure here.
    SELECT [col1],[col2] FROM @Proc1Result

END

我尝试使用INSERT INTO @Proc1Result EXEC Proc2 (带参数传递),但是INSERT EXEC不能在嵌套语句中调用。

有没有什么方法可以实现这个功能?环境是SQL Server 2008。

3个回答

12

您可以嵌套存储过程,最多可达32级

我建议阅读这篇文章关于INSERT-EXEC。以下是一个片段:

如果某个存储过程尝试使用INSERT-EXEC调用另一个存储过程,您将收到错误消息。因此,在 SQL Server 中,一次只能有一个 INSERT-EXEC 处于活动状态。这是一个限制。


5

你说得对,INSERT ... EXEC不能嵌套。来源于如何在存储过程之间共享数据

它无法嵌套。如果some_sp尝试使用INSERT-EXEC调用some_other_sp,则会收到错误消息。因此,您一次只能有一个活动的INSERT-EXEC。这是SQL Server中的限制。

您需要找到其他方法。链接到Erland的文章详细讨论了您拥有的几乎所有选项。


我怎么会在你之前2分钟发布了完全相同的链接和引用,但是你却有更多的赞成票呢?一定是因为泰迪熊... - Abe Miessler
1
@Abe:我的程序已经格式化了过程名称,这需要数小时的工作,但选民们很欣赏这额外的努力 ;) - Remus Rusanu
1
Remus还从源代码中引用了更大的部分,这无疑会为OP提供更多关于该主题的背景信息。 :) - Andriy M

2

从一个存储过程中获取结果并传递给另一个存储过程的语法如下:

INSERT INTO [myTable]
EXEC Proc1 [param1], [param2], [param3], etc.

但是您必须先创建要插入的表,字段名称和类型必须完全匹配。


另外两个答案甚至不一致。(顺便说一下,您可以嵌套它们。)我真的看不出OP在哪里声明他们嵌套超过一次,但也许我没有正确理解。 - Mark SQLDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接