如何从存储过程中将多个输出捕获到临时表中

Muh*_*san 4 sql t-sql sql-server sql-server-2008

我的存储过程返回两个输出.我想在另一个存储过程中使用其中一个.所以试图在临时表中获取第二个输出.但由于两个输出的结构不同,因此我总是得到"列名或提供的值的数量与表定义不匹配".

即使我改变输出的顺序(第一个输出第二个和第二个输出第一个),它也不起作用.

我正在建立一个全新的应用程序,我需要再次在另一个存储过程中使用存储过程.如果我遇到这种情况,我可能需要重写很多代码.

有一个非常好的问题,但这只涵盖一个输出.

将存储过程的结果插入临时表

谢谢

Pet*_*hia 7

你不能,不能没有修改存储过程.

在SQL Server中,您只能将存储过程的第一个结果集插入到另一个表中INSERT...EXEC.列数和位置必须完全匹配,并且INSERT...EXEC不能嵌套,即不能从proc1插入proc2中的表,然后从proc2插入proc3中的表.这INSERT...EXEC是一个完全不满意的解决方案.

解决方法是修改过程以将结果插入调用范围中定义的临时表,例如:

create proc get_some_data as
insert #temp1 (col1, col2) select col1, col2 from table1
insert #temp2 (colA, colB) select colA, colB from table2
go
create table #temp1 (col1 int, col2 int)
create table #temp2 (colA int, colB int)
exec get_some_data
select * from #temp1
select * from #temp2
drop table #temp1
drop table #temp2
go
Run Code Online (Sandbox Code Playgroud)

如果无法修改程序, 你运气不好 更正:正如HABO所指出的,您可以使用CLR迭代结果集.请参阅以下链接了解详情.如果你知道自己在做什么,也没有别的选择.

有关在存储过程之间共享数据的更多详细信息,请参阅Erland Sommarskog撰写的这篇非常全面的文章:http://www.sommarskog.se/share_data.html

  • 引用的文章指出CLR可用于处理由存储过程返回的多个结果集而不改变存储过程.我很害怕,虽然OP可能会高兴. (4认同)
  • @HABO,是的,你是绝对正确的,在SQLCLR中你可以打开一个datareader并迭代结果集.一旦你知道自己在做什么,如果你别无选择,那就不要太糟糕了. (2认同)