2013-11-29 70 views
14

據我所知,我想要做的是不可能在SQL中,但它值得問你們。執行存儲過程到動態臨時表

可以說我有一個存儲過程abc,它返回列Id和值。這個存儲過程主要由其他部門使用,出於功能方面的原因,我只會每隔一段時間使用它來進行數據檢查。

所以用它作爲我的存儲過程的一部分:

DECLARE @tABC TABLE 
(
    ID  INT, 
    Value DECIMAL(12,2) 
) 

INSERT INTO @tABC 
    EXEC OtherDb.DataProd.abc 

OKY所以這將很好地工作現在,但是如果他們改變自己的存儲過程的結構是什麼?

從他們的存儲過程添加或刪除一列會破壞我的代碼,所以有辦法讓我的代碼更加靈活。

我最後的孤注一擲去是這樣的:

WITH tempTable AS 
(
    EXEC OtherDb.DataProd.abc 
) 
SELECT ID, Value FROM tempTable 

這顯然遭到慘敗。

+3

這就是爲什麼你應該使用表值函數或表變量而不是存儲過程來返回表。無論如何,OPENROWSET可能是您的解決方案 – adrianm

+0

@adrianm您對UDF的評論實際上解決了我的問題。我不相信我以前沒有看到過。 – JAT

+0

[將存儲過程的結果插入臨時表中]的可能重複(http://stackoverflow.com/questions/653714/insert-results-of-a-stored-procedure-into-a-temporary-table) –

回答

8
SELECT * INTO #TempTable 
FROM OPENROWSET 
('SQLNCLI','Server=(local)\SQL2008R2;Trusted_Connection=yes;', 
    'EXEC OtherDb.DataProd.abc') 

SELECT * FROM #TempTable 
+0

啓用OPENROWSET不是安全風險嗎? – JAT

+0

在某種程度上,是的。但是沒有其他方法可以滿足您的需求,AFAIK – Raj

6

插入臨時表。我知道這在2008年及以上的作品,不知道2005年左右。你的臨時表列必須匹配你的存儲過程列。

create table #mytable (custid int,company varchar(50),contactname varchar(50) 
       , phone varchar(50),address1 varchar(50) 
       , address2 varchar(50),city varchar(50) 
       ,st varchar(2),zip varchar(20)) 

insert into #mytable (custid,company,contactname,phone,address1,address2,city,st,zip) 
exec dbo.sp_Node_CustomerList_wService @segid = 1 

select * from #mytable 
where custid = 5 

drop table #mytable 
+0

問題是「Oky,所以現在可以完美地工作,但如果他們改變了存儲過程的結構呢?」所以這不是一個好的解決方案。 – CLS

+0

我同意評論人: Adriaan Davel 7年7月20日於9:15 請參閱上面的評論。 –

0

最好是簡便的方法來使用OPENROWSET

SELECT * INTO #tempTable FROM OPENROWSET( 'SQLNCLI', '服務器=本地主機; Trusted_Connection =是;', 「EXEC OtherDb.DataProd。 abc')

+0

請添加一些描述來回答。 –