2012-12-09 42 views
4

我的存儲過程向我返回兩個輸出。我想在其他存儲過程中使用其中的一個。所以試圖抓住臨時表中的第二個輸出。但由於兩個輸出的結構不同,因此我總是會得到「列名或提供的值數量與表定義不匹配」。如何從存儲過程中將多個輸出抓取到臨時表中

即使我改變輸出的順序(第一個輸出第二個和第二個輸出第一個),它不起作用。

我正在建立一個全新的應用程序,我需要在另一個存儲過程中再次使用存儲過程。如果我面對這種情況,可能需要重寫很多代碼。

有一個很好的問題,但是這隻包含一個輸出。

Insert results of a stored procedure into a temporary table

感謝

+0

只是爲了澄清,你問一個返回有不同的架構行集2的存儲過程? IIRC,TSQL不支持訪問除返回的第一個行集外的任何內容。 – HABO

回答

6

你不能,不能沒有修改存儲過程。

在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 

如果不能修改的程序,你的運氣了。更正:正如HABO指出的那樣,您可以使用CLR來迭代結果集。詳情請參閱下面的鏈接。如果你知道自己在做什麼,也不會太壞,也別無選擇。

有關存儲過程之間共享數據的詳細信息,請參閱厄蘭Sommarskog這個非常全面的文章:http://www.sommarskog.se/share_data.html

+4

本文引用的文章指出,CLR可用於處理存儲過程返回的多個結果集,而不會更改存儲過程。我很擔心,儘管OP可能會高興。 – HABO

+2

@HABO,是的,你是絕對正確的,在SQLCLR中你可以打開一個datareader並迭代結果集。一旦你知道你在做什麼,並且如果你沒有其他選擇,就不會太糟糕。 –

+1

這是一個非常好的主意,現在我不需要重寫存儲過程。 –

相關問題