我知道可以从 sys.columns 和 tempdb.sys.columns SELECT 特定表的列的名称。
可以通过 CTE 完成同样的工作吗?
id
有没有办法知道这个CTE的列是名称,姓氏,年龄和地址,而不需要将CTE结果转储到临时表中从那里读到专栏?
谢谢!
答案 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 强>