Существует ли процедура для возврата метаданных для всех наборов результатов в хранимой процедуре?
Что-то вроде 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
Ответы:
Нет и да.
нет
Нет чистого средства T-SQL для доступа к большему, чем первый набор результатов. Даже OPENROWSET и OPENQUERY имеют одинаковое ограничение:
Для справки, я не говорю и не подразумеваю, что есть какое-то общее техническое основание для этого ограничения. Я просто указывая на то , что ограничение не ограничивается
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 доступна только в полной версии).
источник