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_object
tidak 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
Jawaban:
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:
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
, dansys.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 dalamBEGIN 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).
sumber