SQL Server中CTE的列名

时间:2018-06-04 13:30:49

标签: sql sql-server common-table-expression

我知道可以从 sys.columns tempdb.sys.columns SELECT 特定表的列的名称。

可以通过 CTE 完成同样的工作吗?

id

有没有办法知道这个CTE的列是名称,姓氏,年龄地址,而不需要将CTE结果转储到临时表中从那里读到专栏?

谢谢!

2 个答案:

答案 0 :(得分:4)

这是一种没有实际使用动态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

答案 1 :(得分:0)

是的,可以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);

<强> db<>fiddle demo