Имена столбцов CTE в SQL Server - PullRequest
0 голосов
/ 04 июня 2018

Я знаю, что возможно ВЫБРАТЬ , из sys.columns и из tempdb.sys.columns именастолбцы определенной таблицы.

Можно ли сделать то же самое из CTE ?

with SampleCTE as (
 Select 
   'Tom' as Name
  ,'Bombadill' as Surname
  ,99999 as Age
  ,'Withywindle' as Address
)

. Есть ли способ узнать, что столбцы этого CTE Имя, Фамилия, Возраст и Адрес , не прибегая к выводу результата CTE во временную таблицу и чтению оттуда столбцов?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Вот «динамический» подход без фактического использования Dynamic SQL.

Unpivot (динамический или нет) будет более производительным

Пример

with SampleCTE as (
 Select 
   'Tom' as Name
  ,'Bombadill' as Surname
  ,99999 as Age
  ,'Withywindle' as Address
) 
Select C.*
 From SampleCTE A
 Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
 Cross Apply (
                Select Item  = a.value('local-name(.)','varchar(100)')
                      ,Value = a.value('.','varchar(max)') 
                 From  B.XMLData.nodes('/row')  as C1(n)
                 Cross Apply C1.n.nodes('./@*') as C2(a)
                 Where a.value('local-name(.)','varchar(100)') not in ('ID','ExcludeOtherCol')
             ) C

Возвращает

Item    Value
Name    Tom
Surname Bombadill
Age     99999
Address Withywindle
0 голосов
/ 04 июня 2018

Да, это возможно sys.dm_exec_describe_first_result_set :

Эта функция динамического управления принимает оператор Transact-SQL в качестве параметра и описывает метаданные первогонабор результатов для оператора.

SELECT name
FROM sys.dm_exec_describe_first_result_set(
N'
with SampleCTE as (
 Select 
   ''Tom'' as Name
  ,''Bombadill'' as Surname
  ,99999 as Age
  ,''Withywindle'' as Address
)
SELECT * FROM SampleCTE
', NULL, NULL);

дБ <> fiddle demo

...