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 - ResultSetFilter.cs


3
Ні, в SQL Server такого немає, для цього вам доведеться написати код (і вам, мабуть, доведеться гадати в багатьох випадках).
Аарон Бертран

Відповіді:


3

Чи існує процедура повернення метаданих для всіх наборів результатів у збереженій процедурі?

Ні і так.

Ні

Не існує чистих засобів T-SQL для доступу до більш ніж першого набору результатів. Навіть OPENROWSET та OPENQUERY мають однакове обмеження:

Хоча запит може повертати кілька наборів результатів, OPEN (ROWSET | QUERY) повертає лише перший.

Для запису я не кажу ні про те, що є якась загальна технічна причина цього обмеження. Я просто вказуючи на те , що обмеження не обмежується sp_describe_first_result_set, sys.dm_exec_describe_first_result_setі sys.dm_exec_describe_first_result_set_for_object.

Так

Єдиний спосіб збору інформації - метаданих набору результатів і навіть результатів - для наборів результатів 2 - n - через код програми. Спочатку слід виконати запити / збережену процедуру, використовуючи SqlCommand.ExecuteReader (CommandBehavior) з CommandBehavior of KeyInfo. Потім ви можете отримати метадані набору результатів за допомогою методу SqlDataReader.GetSchemaTable та виклику методу SqlDataReader.NextResult, щоб пройти цикл через набори результатів. Просто майте на увазі , що, роблячи це з допомогою програми коду не має обмежень не працює з динамічним SQL і тимчасових таблиць, це робитьнасправді запустіть код SQL, і якщо у вас є оператори DML і хочете лише метадані набору результатів, не викликаючи жодних змін даних, вам доведеться загортати тестування SQL в BEGIN TRAN/ ROLLBACK TRAN.

Тип програми може бути звичайним додатком для Windows, консольним додатком, веб-додатком тощо, або навіть це може бути функція SQLCLR / збережена процедура.

Що стосується цього за допомогою SQLCLR, вже існує збережена процедура, яка робить те, що описано тут. Він називається DB_DescribeResultSets і є частиною бібліотеки SQL # (якою я є автором, і поки існує безкоштовна версія, DB_DescribeResultSets доступний лише у повній версії).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.