具有未知列名

时间:2017-07-25 18:19:20

标签: sql sql-server-2008 pivot unpivot

我无法转动以下内容

    FirstName    LastName
    ----------------------
    Talyor       Swift
    Bruno        Mars

以下

    ColumnName    ColumnValue
    --------------------------
    FirstName     Talyor
    LastName      Swift
    FirstName     Bruno
    LastName      Mars

我没有任何线索如何在没有硬编码的情况下启动它,尤其是从系统中检索列名的方法。

**未给出源表中的列名

2 个答案:

答案 0 :(得分:1)

这是一种通过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

<强>返回

Item        Value   ColumnOrder
FirstName   Talyor  1
LastName    Swift   2
FirstName   Bruno   1
LastName    Mars    2

编辑 - 动态UnPivot

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)

答案 1 :(得分:-1)

从我在问题中看到的情况来看,这应该有效:

select 'firstname', firstname from table
union all
select 'lastname', lastname from table

如果列名称未知,您可以从sys.columns表中选择它们,创建一个sql字符串并使用exec函数来执行sql string。