Как я могу описать несколько наборов результатов из процедуры в SQL Server?

#sql-server

Вопрос:

У меня есть процесс генерации кода доступа к данным, который использует sys.dm_exec_describe_first_result_set для поиска типов столбцов в результирующих наборах. Это очень хорошо работает для первого набора результатов. Однако я хотел бы расширить его до нескольких наборов результатов. Есть ли разумный способ сделать это?

Пример кода для поиска результирующего набора.

  SELECT rs.name, rs.is_nullable, t.name AS typeName, rs.max_length, rs.precision, rs.scale FROM sys.dm_exec_describe_first_result_set(' select ''A'' as ColumnA, ''B'' as ColumnB, ''C'' as ColumnC  select ''D'' as ColumnA, ''E'' as ColumnB, ''F'' as ColumnC ', NULL, 1) rs LEFT JOIN sys.types t ON rs.system_type_id = t.system_type_id WHERE rs.name IS NOT null AND t.name lt;gt; 'sysname'  

В настоящее время результаты в

 name is_nullable typeName max_length precision scale -------------------------------------------------------------------------------------------------------------------------------- ----------- -------------------------------------------------------------------------------------------------------------------------------- ---------- --------- ----- ColumnA 0 varchar 1 0 0 ColumnB 0 varchar 1 0 0 ColumnC 0 varchar 1 0 0   

Пожалуйста, обратите внимание, что два встроенных оператора select предназначены для простых примеров. Реальные процедуры будут иметь сложную логику и не могут быть разделены на несколько процедур.

Комментарии:

1. Как следует из названия dm_exec_describe_first_result_set , он описывает первый набор результатов. Сам SQL Server плохо обрабатывает инструкции, возвращающие несколько наборов результатов. К счастью, это происходит только при использовании процедур, поэтому их можно легко изменить, чтобы разделить на отдельные процедуры. Для вышеперечисленных, поскольку они являются буквальными утверждениями, просто разделите их на 2 вызова.

2. @Larnu В моем сценарии я не могу разбить их на несколько процедур. Я надеялся, что будет способ получить аналогичные результаты, как это, но без «первого» ограничения. В коде нет никакой условной логики, вокруг которой возвращаются результирующие наборы.

3. Нет, как я уже говорил, SQL Server практически не поддерживает внутреннее использование нескольких результирующих наборов.

4. Нет, это невозможно. Вам понадобится синтаксический анализатор T-SQL, и обратите внимание, что вы никогда не сможете учитывать условия выполнения, такие как IF WHILE операторы or