#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