Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server中CTE的列名_Sql_Sql Server_Common Table Expression - Fatal编程技术网

SQL Server中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

我知道可以从sys.columns和tempdb.sys.columns中选择特定表的列名称

是否可以从CTE执行相同操作

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