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 - DB модульное тестирование для SQL Server - ResultSetFilter.cs

JJS
источник
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 доступна только в полной версии).

Соломон Руцкий
источник