web-dev-qa-db-ja.com

ストアドプロシージャから返された列名/タイプを取得します

メタデータ(おそらくInformation_Schema)を介して、sprocが返す列のリストを取得する方法はありますか?私はいくつかのコード生成を自動化しようとしています、そしてそれは非常に役立つでしょう...

16
Caveatrob

INFORMATION_SCHEMA.ROUTINESのROUTINE_DEFINITIONの内容を解析する準備ができていない限り、最善の策は、プロシージャを実行し、返されたレコードから列情報を読み取ることです。

.NETでは、ストアドプロシージャの結果をDataTableに読み込み、 Columns プロパティをクエリすることでこれを行うことができます。

これを行う簡単な方法がない理由は、ストアドプロシージャが、パラメータに基づいて異なる結果セットを返す可能性があるためです。ユーザー定義関数のような固定の結果セット形式はありません。

編集

他の回答で述べたように、データが返されないようにするには、 SET FMTONLY ON を使用する必要があります。 SETFMTONLYが機能しない状況がいくつかあります。ストアドプロシージャで#tempテーブルを使用する場合、ただし 回避策 があります。

14
Bennor McCarthy

Profilerを実行して、強く型付けされたデータセットのドラッグアンドドロップに対してVisualStudioがこれをどのように行うかを確認しました。

これはそれが送信したコードです。

 SET NO_BROWSETABLE ON; 
 SET FMTONLY ON;

exec dbo.aspnet_Roles_GetAllRoles @ApplicationName=NULL

したがって、「より公式な」方法はないのではないかと思います。

明らかに、単一のストアドプロシージャが、渡されたパラメータに応じて複数の結果セットまたは異なる結果セットを返す可能性があることに注意する必要があります。

2012年以降の人々にとって、別のアプローチは sp_describe_first_result_set

11
Martin Smith

これを行う私の方法:INTO句を持つようにストアドプロシージャを編集します。

変化する

Select * from tablename

Select * INTO _tablename FROM tablename

これにより、データベースにテーブルが作成されます。次に、SELECT * FROM INFORMATION_SCHEMA WHERE TABLE_NAME = '_tablename'を使用します

Sprocへの変更を元に戻すことを忘れないでください。

3
Steve Gray