2010-09-19 49 views

回答

13

除非你準備解析INFORMATION_SCHEMA.ROUTINES中的ROUTINE_DEFINITION的內容,那麼你最好的選擇將是執行程序,並閱讀來自記錄的列信息被返回。

在.NET中,您可以通過將存儲過程的結果讀入DataTable並查詢Columns屬性來完成此操作。

有沒有簡單的方法來做到這一點的原因是存儲過程可能會根據參數返回不同的結果集。沒有固定的結果集格式,就像用戶定義的函數一樣。

編輯

正如在其他答覆中提到,您將需要使用SET FMTONLY ON,以確保不會返回任何數據。 SET FMTONLY在某些情況下不起作用,例如在存儲過程中使用#temp表時,但存在workaround

+0

對於SQL2012,請按照本文中的建議操作:http://stackoverflow.com/a/14575114/569662 – 2016-04-15 09:40:57

+0

如果Microsoft堅持在.NET Core中棄用DataTable,那麼如果您轉移到Core,此方法將停止工作。 – 2016-09-16 19:34:49

9

我剛剛運行了Profiler來查看Visual Studio如何爲強類型的數據集拖放操作。

這是它發送的代碼。

SET NO_BROWSETABLE ON; 
SET FMTONLY ON; 

exec dbo.aspnet_Roles_GetAllRoles @ApplicationName=NULL 

所以我認爲可能沒有任何「更正式」的方式來做到這一點。

顯然你需要記住單個存儲過程可能會返回多個結果集或依賴於傳遞的參數的不同結果集。

對於人們對2012+的另一種方法可能是使用sp_describe_first_result_set

1

我這樣做的方式: 編輯存儲過程有一個INTO子句:

變化

Select * from tablename 

Select * INTO _tablename FROM tablename 

這產生了數據庫中的表。 然後,使用SELECT * FROM INFORMATION_SCHEMA WHERE TABLE_NAME = '_tablename'

不要忘記取消對存儲區的修改。