複数の結果セットに対するdm_exec_describe_first_result_set_for_object


9

ストアドプロシージャのすべての結果セットのメタデータを返すプロシージャはありますか?

のようなものsys.dm_exec_describe_first_result_set_for_objectですが、すべての結果セットについてですか?

最終的には、データベース内のすべてのストアドプロシージャのすべての結果セットのメタデータを発見したいと思います。とりあえず、sys.dm_exec_describe_first_result_set_for_object説明できない結果セットのみで解決します。つまり、2番目、3番目、およびN番目の結果セットです。

SQLCLRを使用してこれを行う方法を見てみましょう。

複数の結果セットを含むプロシージャの結果を保存する方法
tSQLt-SQL ServerのDBユニットテスト-ResultSetFilter.cs


3
いいえ、SQL Serverにはそのようなことはありません。それを行うにはコードを記述する必要があります(多くの場合、推測する必要があります)。
アーロンバートランド

回答:


3

ストアドプロシージャのすべての結果セットのメタデータを返すプロシージャはありますか?

いいえ、はい。

番号

最初の結果セット以上にアクセスする純粋なT-SQLの手段はありません。でもOPENROWSETOPENQUERYは同じ制限があります。

クエリは複数の結果セットを返す可能性がありますが、OPEN(ROWSET | QUERY)は最初の結果セットのみを返します。

記録のために、私はこの制限の一般的な技術的理由があることを言ったり、示唆したりしていません。私は制限がに限定されていないことを指摘していますsp_describe_first_result_setsys.dm_exec_describe_first_result_setsys.dm_exec_describe_first_result_set_for_object

はい

情報(結果セットのメタデータ、さらには結果)を取得する唯一の方法は、結果セット2-nの場合、アプリケーションコードを使用することです。最初に使用して、クエリ/ストアドプロシージャ(複数可)を実行することになるSqlCommand.ExecuteReader(たCommandBehavior)を用いてのCommandBehaviorKeyInfo。その後、あなたは結果セットのメタデータを使用して取得することができSqlDataReader.GetSchemaTable方法を、および呼び出しSqlDataReader.NextResultの結果セットを循環する方法を。ただ、アプリのコードを経由してこれを行うことは、動的SQLおよび一時テーブルで作業していないの制限はありませんが、それがいることを心に留めておく実際にSQLコードを実行し、DMLステートメントがあり、データを変更せずに結果セットのメタデータのみが必要な場合は、テストするSQLをBEGIN TRAN/でラップする必要がありますROLLBACK TRAN

アプリケーションのタイプは、通常のWindowsアプリ、コンソールアプリ、Webアプリなどにすることができ、SQLCLR関数やストアドプロシージャにすることもできます。

SQLCLRを介してこれを行うことに関しては、ここで説明されていることを実行するストアドプロシージャが既に存在します。これはDB_DescribeResultSetsと呼ばれ、SQL#ライブラリの一部です(私はこのライブラリを作成しています。無料バージョンはありますが、DB_DescribeResultSetsはフルバージョンでのみ使用できます)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.