SQL Server 2008 旋转 table 列名未知
SQL Server 2008 pivoting table with unknown column name
我无法调整以下内容
FirstName LastName
----------------------
Talyor Swift
Bruno Mars
以下
ColumnName ColumnValue
--------------------------
FirstName Talyor
LastName Swift
FirstName Bruno
LastName Mars
我不知道如何在不对其进行硬编码的情况下启动它,尤其是从系统中检索列名的方法。
** 未给出源 table 中的列名称
根据我在问题中看到的,这应该有效:
select 'firstname', firstname from table
union all
select 'lastname', lastname from table
如果不知道列名,您可以从 sys.columns
table 中 select 它们,制作一个 sql 字符串并使用 exec
函数执行sql 字符串。
这是一个 "dynamic" 方法,它是通过 XML 实现的。
显然 UNPIVOT 会更高效
例子
Select C.*
,ColumnOrder = D.ORDINAL_POSITION
From YourTable A
Cross Apply (Select XMLData = cast((Select A.* for XML Raw) as xml) ) B
Cross Apply (
Select Item = attr.value('local-name(.)','varchar(100)')
,Value = attr.value('.','varchar(max)')
From B.XMLData.nodes('/row') as n(r)
Cross Apply n.r.nodes('./@*') AS B(attr)
) C
Join INFORMATION_SCHEMA.COLUMNS D on D.Table_Name='YourTable' and D.Column_Name=C.Item
Returns
Item Value ColumnOrder
FirstName Talyor 1
LastName Swift 2
FirstName Bruno 1
LastName Mars 2
编辑 - 动态逆透视
Declare @SQL varchar(max) ='
Select ColumnOrder = D.ORDINAL_POSITION
,Item
,Value
From YourTable
UnPivot (Value for Item in ('+Stuff((Select ',' +QuoteName(Name)
From sys.columns
Where objecT_id = OBJECT_ID('YourTable')
For XML Path ('')),1,1,'')
+')) as UnPiv
Join INFORMATION_SCHEMA.COLUMNS D on D.Table_Name=''YourTable'' and D.Column_Name=UnPiv.Item
'
--Print @SQL
Exec(@SQL)
我无法调整以下内容
FirstName LastName
----------------------
Talyor Swift
Bruno Mars
以下
ColumnName ColumnValue
--------------------------
FirstName Talyor
LastName Swift
FirstName Bruno
LastName Mars
我不知道如何在不对其进行硬编码的情况下启动它,尤其是从系统中检索列名的方法。
** 未给出源 table 中的列名称
根据我在问题中看到的,这应该有效:
select 'firstname', firstname from table
union all
select 'lastname', lastname from table
如果不知道列名,您可以从 sys.columns
table 中 select 它们,制作一个 sql 字符串并使用 exec
函数执行sql 字符串。
这是一个 "dynamic" 方法,它是通过 XML 实现的。
显然 UNPIVOT 会更高效
例子
Select C.*
,ColumnOrder = D.ORDINAL_POSITION
From YourTable A
Cross Apply (Select XMLData = cast((Select A.* for XML Raw) as xml) ) B
Cross Apply (
Select Item = attr.value('local-name(.)','varchar(100)')
,Value = attr.value('.','varchar(max)')
From B.XMLData.nodes('/row') as n(r)
Cross Apply n.r.nodes('./@*') AS B(attr)
) C
Join INFORMATION_SCHEMA.COLUMNS D on D.Table_Name='YourTable' and D.Column_Name=C.Item
Returns
Item Value ColumnOrder
FirstName Talyor 1
LastName Swift 2
FirstName Bruno 1
LastName Mars 2
编辑 - 动态逆透视
Declare @SQL varchar(max) ='
Select ColumnOrder = D.ORDINAL_POSITION
,Item
,Value
From YourTable
UnPivot (Value for Item in ('+Stuff((Select ',' +QuoteName(Name)
From sys.columns
Where objecT_id = OBJECT_ID('YourTable')
For XML Path ('')),1,1,'')
+')) as UnPiv
Join INFORMATION_SCHEMA.COLUMNS D on D.Table_Name=''YourTable'' and D.Column_Name=UnPiv.Item
'
--Print @SQL
Exec(@SQL)