SQL Server 中 CTE 的列名

Ald*_*ldo 4 sql sql-server common-table-expression

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

可以从CTE做同样的事情吗?

with SampleCTE as (
 Select 
   'Tom' as Name
  ,'Bombadill' as Surname
  ,99999 as Age
  ,'Withywindle' as Address
)
Run Code Online (Sandbox Code Playgroud)

有什么方法可以知道这个 CTE 的列是Name,Surname,AgeAddress,而不必求助于将 CTE 结果转储到临时表并从那里读取列?

谢谢!

Luk*_*zda 5

是的,有可能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);
Run Code Online (Sandbox Code Playgroud)

db<>小提琴演示


Joh*_*tti 5

这是一种不实际使用动态 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
Run Code Online (Sandbox Code Playgroud)

退货

Item    Value
Name    Tom
Surname Bombadill
Age     99999
Address Withywindle
Run Code Online (Sandbox Code Playgroud)

  • 赞成在您的样本数据中包含 Tom Bombadil!:) (2认同)