从另一个存储过程调用的存储过程中获取第一个结果集

时间:2009-06-12 18:17:57

标签: sql-server sql-server-2005 stored-procedures

我有一个SQL Server 2005存储过程,它返回两个模式不同的结果集。

另一个存储过程将它作为Insert-Exec执行。但是我需要插入第一个结果集,而不是最后一个结果集。有什么方法可以做到这一点?

我可以创建一个新的存储过程,它是第一个只返回我想要的结果集的副本,但我想知道我是否可以使用返回两个的现有结果集。

3 个答案:

答案 0 :(得分:3)

实际上,INSERT..EXEC将尝试将BOTH数据集插入表中。如果列计数匹配并且可以隐式转换数据类型,那么您实际上将获得两者。

否则,它将始终失败,因为无法获取其中一个结果集。

此问题的解决方案是从调用过程中提取所需的功能,并将其合并到(以前的)调用过程中。并且在做的时候提醒自己“SQL不像客户端代码:冗余代码比冗余数据更容易接受”。

如果上面不清楚,请让我描述在这种情况下任何人都可以使用的事实和选项:

1)如果返回的两个结果集是兼容的,那么你可以使用INSERT将两者都放在同一个表中,并尝试删除那些你不想要的结果。

2)如果两个结果集不兼容,则INSERT..EXEC无法生效。

3)您可以将代码复制出被调用的程序并在调用者中重复使用,并处理双重编辑维护的成本。

4)您可以将被调用的程序更改为与其他程序更兼容。

多数民众赞成。对于这种情况,这些是您在T-SQL中的选择。您可以使用SQLCLR或客户端代码进行一些额外的技巧,但它们会涉及到这一点。

答案 1 :(得分:0)

有没有令人信服的理由为什么你不能让第一个sproc只返回一个结果集?通常,您应该避免让一个sproc同时执行INSERT和SELECT(例外情况是SELECT是要获取新创建的行的标识)。

答案 2 :(得分:0)

为了防止代码在两个进程之间失去同步,为什么不编写一个proc来执行你想要的插入操作,在你的进程中调用它并使用orginal proc调用来获取第一个记录集和然后做任何它需要做的事情。

根据你如何选择,可能会重构为表值函数而不是两个进程都会调用的proc。