Microsoft SQL Server 2005 从返回多个表的子过程插入表

Posted

技术标签:

【中文标题】Microsoft SQL Server 2005 从返回多个表的子过程插入表【英文标题】:Microsoft SQL Server 2005 Inserting into tables from child procedure which returned multiple tables 【发布时间】:2010-04-16 14:32:32 【问题描述】:

我有一个子过程,它返回的不仅仅是表格。

孩子:

PROCEDURE KevinGetTwoTables
AS BEGIN
    SELECT 'ABC' Alpha, '123' Numeric

    SELECT 'BBB' Alpha, '123' Numeric1, '555' Numeric2
END

示例:

PROCEDURE KevinTesting
AS BEGIN
    DECLARE @Table1 TABLE (
        Alpha varchar(50),
        Numeric1 int
    )
    DECLARE @Table2 TABLE (
        Alpha varchar(50),
        Numeric1 int,
        Numeric2 int
    )

    --INSERT INTO @Table1
    EXEC KevinGetTwoTables
END

【问题讨论】:

在这里打个问号,否则人们会吓坏的。 【参考方案1】:

您将无法在父过程中捕获两个结果集,就像您将一个结果集捕获到临时表中一样。但是,还有其他几种选择。阅读优秀文章How to Share Data Between Stored Procedures by Erland Sommarskog。

如果您使用的是 SQL Server 2008,请查看Table Parameters and Table Types 部分。您可以将表作为输出参数传递回父级。

如果您不在 SQL Server 2008 上,请查看section on Sharing a Temp Table。

您基本上在父过程中创建两个#TempTables,在子过程中填充每个#TempTables 并终止子过程。当您返回父过程时,每个#TempTable 中都有数据。

【讨论】:

【参考方案2】:

据我所知,没有办法在 T-SQL 中捕获第二个结果集。

您可以通过CLR stored procedure 进行操作。

【讨论】:

如果不能更改子过程,使用 CLR 很好:sommarskog.se/share_data.html#CLR

以上是关于Microsoft SQL Server 2005 从返回多个表的子过程插入表的主要内容,如果未能解决你的问题,请参考以下文章

SQL server2005 安装错误

Microsoft SQL Server 2005 函数,传递开始和结束时间列表

问:卸载microsoft sql server 2005 backward compatibility的方法

Microsoft SQL Server 2005 从返回多个表的子过程插入表

识别 Microsoft SQL Server 2005 中未使用的对象

在 Microsoft SQL Server 2005 中模拟 group_concat MySQL 函数?