将稀疏列转换为表行;使用节点名称未知的XML

时间:2019-02-08 14:59:13

标签: sql-server xml

我继承了一个使用稀疏列的应用程序。这种架构使我头疼不已。最终,我的目标是将这些列转换为表行。数据库位于SQL Server 2012上。

表中有超过8000列,并且有一个名为“ SpecialPurposeColumns”的列,我认为这被称为“列集”。该列包含具有数据的列的XML表示形式。 SpecialPurposeColumns中的数据如下所示:

<q7109>2</q7109><q7110>4</q7110><q7111>1</q7111><q7120>4</q7120>

这些节点名称与8000+列之一相对应,并且对于给定的记录列,仅当它们包含一个值时才以XML表示。我不知道XML中将代表哪些列,所以我也不知道将显示哪些节点名称。

这可能是不行,但实际上这里有两个问题:

  1. 如何遍历SpecialPurposeColumns中的节点并获取节点名称和值?我看过很多有关在SQL中解析XML的帖子,而且所有这些帖子似乎都假定节点名称是已知的。

  2. 鉴于我的最终目标是将列数据转换为行,是否有比遍历每一行和每个SpecialPurposeColumns节点更好的方法来将这些值作为行获取到另一个表中?

1 个答案:

答案 0 :(得分:1)

示例

ar.Attribute("objectClass", []string{"organizationalPerson","person","top","user"})

返回

Declare @YourTable Table (ID int,SpecialPurposeColumns xml)
Insert Into @YourTable Values 
(1,'<q7109>2</q7109><q7110>4</q7110><q7111>1</q7111><q7120>4</q7120>')

Select A.ID
      ,B.*
 From @YourTable A
 Cross Apply (
               Select Item  = xAttr.value('local-name(.)', 'varchar(100)')
                     ,Value = xAttr.value('.','varchar(max)')
                From  SpecialPurposeColumns.nodes('*') xNode(xAttr)
             ) B