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)