2013-07-29 132 views
0

我創建了一個創建臨時表的存儲過程。現在我需要能夠使用.NET查詢它。所以我需要這樣的東西:動態查詢在存儲過程中創建的臨時表

SELECT * FROM storedProcedure() WHERE ... 

由存儲過程創建的表也是動態的,所以模式會改變。使用SQL Server 2005.

我不能使用一個函數,因爲需要返回的是一個動態表。事先必須定義表格使得函數無用。

我最終創建了一個全局臨時表,藉助動態SQL我能夠創建一個動態全局臨時表並通過.NET訪問它。

+1

看到這個帖子從存儲過程中選擇: [http://stackoverflow.com/questions/1492411/sql-server-select-from-stored-procedure][1] [1]:http://stackoverflow.com/questions/1492411/sql-server-select-from-stored-procedure – BWS

+1

我們應該假設SQL Server是你的RDBMS嗎?全局臨時表怎麼樣? – Bridge

+0

@Bridge我正在考慮全局臨時表,但如果有多個事務同時進行,那麼這不會被覆蓋嗎? – user1938919

回答

1

由於參考指示,你使用類似:

insert into @t(<columns here>) 
    exec stored_procedure; 

然而,在很多情況下,你可以用一個用戶自定義函數替換該存儲過程。這些被定義爲返回值,並根據需要使用它可以準確地使用:

select * 
from dbo.udf_MyFunction(); 

有,當然,優點和缺點每種方法。存儲過程方法的一個缺點是不能嵌套這樣的存儲過程。函數方法的一個缺點是不能使用動態SQL。

+0

使用函數然後是否可以返回一個動態表,因爲正如我已經看到的函數一樣,您必須在創建時聲明返回的表及其模式? – user1938919

+0

@ user1938919。 。 。使用內聯表值函數,return子句指定格式。對於多行表值函數,則需要將該類型聲明爲定義的一部分。但是,要將存儲過程結果捕獲到表中,您需要在執行插入操作之前定義表*,因此您還需要在其中定義表格。 –

+0

不工作,那麼我需要能夠從JSON創建一個動態表,然後將它與另一個表連接起來,然後返回被查詢。不過謝謝。 – user1938919

0

其實,你可以這樣

select * 
from openrowset('SQLNCLI', 'Server=<your server here>;Database=<your database here>;Trusted_Connection=yes;','set fmtonly off exec <your procedure here>') 

但是,我不能建議在生產中執行此操作,請考慮更改存儲過程,用戶自定義函數

相關問題