Ald*_*ldo 4 sql sql-server common-table-expression
我知道可以从sys.columns和tempdb.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,Age和Address,而不必求助于将 CTE 结果转储到临时表并从那里读取列?
谢谢!
是的,有可能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)
这是一种不实际使用动态 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)
| 归档时间: |
|
| 查看次数: |
2780 次 |
| 最近记录: |