Существует ли процедура для возврата метаданных для всех наборов результатов в хранимой процедуре?
Нет и да.
нет
Нет чистого средства 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 доступна только в полной версии).