dm_exec_describe_first_result_set_for_object untuk beberapa set hasil

9

Apakah ada prosedur untuk mengembalikan metadata untuk semua set hasil dalam prosedur tersimpan?

Sesuatu seperti sys.dm_exec_describe_first_result_set_for_object, tetapi untuk semua set hasil?

Akhirnya, saya ingin menemukan metadata untuk setiap hasil yang ditetapkan dalam setiap prosedur yang tersimpan dalam database. Untuk saat ini, saya akan puas hanya dengan set hasil yang sys.dm_exec_describe_first_result_set_for_objecttidak dapat menggambarkan. Yaitu, set hasil ke-2, ke-3, dan ke-N.

Melihat menggunakan SQLCLR untuk melakukan ini sekarang:

Bagaimana cara menyimpan hasil dari suatu prosedur dengan lebih dari satu set hasil
tSQLt - Pengujian Unit DB untuk SQL Server - ResultSetFilter.cs

JJS
sumber
3
Tidak, tidak ada hal seperti itu dalam SQL Server, Anda harus menulis kode untuk melakukannya (dan Anda mungkin harus membuat tebakan dalam banyak kasus).
Aaron Bertrand

Jawaban:

3

Apakah ada prosedur untuk mengembalikan metadata untuk semua set hasil dalam prosedur tersimpan?

Tidak dan Ya.

Tidak

Tidak ada alat T-SQL murni untuk mengakses lebih dari hasil set pertama. Bahkan OPENROWSET dan OPENQUERY memiliki batasan yang sama:

Meskipun kueri mungkin mengembalikan beberapa set hasil, OPEN (ROWSET | QUERY) hanya mengembalikan yang pertama.

Sebagai catatan, saya tidak mengatakan atau menyiratkan bahwa ada alasan teknis umum untuk pembatasan ini. Saya hanya menunjukkan bahwa pembatasan tidak terbatas pada sp_describe_first_result_set, sys.dm_exec_describe_first_result_set, dan sys.dm_exec_describe_first_result_set_for_object.

Iya

Satu-satunya cara untuk mengambil info - set hasil meta-data dan bahkan hasil - untuk set hasil 2 - n adalah melalui kode aplikasi. Anda pertama-tama akan menjalankan query / prosedur tersimpan dengan menggunakan SqlCommand.ExecuteReader (CommandBehavior) dengan CommandBehavior dari KeyInfo. Kemudian, Anda bisa mendapatkan hasil set meta-data menggunakan metode SqlDataReader.GetSchemaTable , dan memanggil metode SqlDataReader.NextResult untuk menggilir set hasil. Hanya perlu diingat bahwa saat melakukan ini melalui kode aplikasi tidak memiliki batasan untuk tidak bekerja dengan Dynamic SQL dan tabel sementara, itu benarsebenarnya menjalankan kode SQL, dan jika Anda memiliki pernyataan DML dan hanya ingin hasilnya mengatur meta-data tanpa menyebabkan perubahan data, maka Anda harus membungkus SQL yang Anda uji dalam BEGIN TRAN/ ROLLBACK TRAN.

Jenis aplikasi dapat berupa Aplikasi Windows biasa, Aplikasi Konsol, Aplikasi Web, dll, atau bahkan dapat berupa fungsi / prosedur tersimpan SQLCLR.

Sehubungan dengan melakukan ini melalui SQLCLR, prosedur tersimpan sudah ada yang melakukan apa yang dijelaskan di sini. Ini disebut DB_DescribeResultSets dan merupakan bagian dari perpustakaan # SQL (yang saya penulis, dan sementara ada versi gratis, DB_DescribeResultSets hanya tersedia dalam versi lengkap).

Solomon Rutzky
sumber