SQL Server中CTE的列名
我知道可以从sys.columns和tempdb.sys.columns中选择特定表的列名称 是否可以从CTE执行相同操作SQL Server中CTE的列名,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,我知道可以从sys.columns和tempdb.sys.columns中选择特定表的列名称 是否可以从CTE执行相同操作 with SampleCTE as ( Select 'Tom' as Name ,'Bombadill' as Surname ,99999 as Age ,'Withywindle' as Address ) 有没有办法知道此CTE的列是姓名、姓氏、年龄和地址,而无需将CTE结果转储到临时表中并从中读取列 谢谢 是的,有可能: 此动态管理函数将T
with SampleCTE as (
Select
'Tom' as Name
,'Bombadill' as Surname
,99999 as Age
,'Withywindle' as Address
)
有没有办法知道此CTE的列是姓名、姓氏、年龄和地址,而无需将CTE结果转储到临时表中并从中读取列
谢谢 是的,有可能:
此动态管理函数将Transact-SQL语句作为参数,并描述该语句的第一个结果集的元数据。
这里是一种“动态”方法,实际上不使用动态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
我对此表示怀疑。我也无法想象您为什么需要这样做。我需要从一系列键->值(Powershell中的哈希表,其他语言中的命名数组)中选择一个变量来取消PIVOT数据。为了取消PIVOT,您需要提前知道要取消PIVOT的列名。不,CTE不是表也不是视图,它们的元数据也不存储(整个查询是)。当然,但我认为可以分析CTE中的select以了解它输出的列。毕竟,它们是提取和显示的。EDI对其进行了测试,确实它可以使用CTE作为数据源。正如您所说,它可能会慢很多(但在我的场景中这不是问题)但是根据过去在Sql中使用XMLData的经验..它会与包含XML标记的数据决裂吗?<>等等?@Aldo我刚刚看到您添加了一个示例CTE并更新了我的答案我尝试了一些“坏”数据,但它似乎对<和>…通过XML解析,任何数据都是“安全的”?虽然这不是对原始问题的正确答案,但在这是一个很好的解决问题的方法。非常感谢John!投票支持将Tom Bombadil包括在您的样本数据中!:)当我看到这样的事情时,我总是不得不打击自己。。。因为,像这样的工具现在已经被烘焙到产品中了!
Item Value
Name Tom
Surname Bombadill
Age 99999
Address Withywindle