【问题标题】:Pivot XML into SQL Columns & values将 XML 转换为 SQL 列和值
【发布时间】:2016-02-24 20:49:14
【问题描述】:

我有一个以下格式的 XML 文件。并非每个字段名称都有一个值。除了 id 字段之外的每个字段都是 varchar(40)。

<index>
  <doc id="0">
    <field name="MFG">
      <val>ACME</val>
    </field>
    <field name="InternalCode">
      <val />
    </field>
    <field name="partnumber">
      <val>012345-00</val>
    </field>
    <field name="partdescription">
      <val>PIN</val>
    </field>
  </doc>
  <doc id="1">
    <field name="MFG">
      <val />
    </field>
    <field name="InternalCode">
      <val>ABCDE</val>
    </field>
    <field name="partnumber">
      <val>919-555-7Z</val>
    </field>    
    <field name="partdescription">
      <val>WASHER</val>
    </field>
  </doc>
  <doc id="2">
    <field name="MFG">
      <val>YOUR COMPANY</val>
    </field>
    <field name="InternalCode">
      <val />
    </field>
    <field name="partnumber">
      <val>131415</val>
    </field>
    <field name="partdescription">
      <val>BOLT</val>
    </field>
  </doc>
</index>

我想做的是读取 XML 并以以下方式在 SQL 中填充表。

换句话说,在 rowid 之后,将其余属性作为列,并将它们的值作为列值。我正在使用以下代码将 rowid、属性及其值列为行。

SELECT  XMLAttribute.rowid, XMLAttribute.name, XMLAttribute.val
FROM OPENXML (@hdoc, 'index/doc/field', 2 ) 
        WITH (rowid int '../@id',
        name       VARCHAR(128) '@name',
        val varchar(128) 'val'                  
            ) AS XMLAttribute

可以这样做(在 rowid 之后旋转)吗?如果有,怎么做?

【问题讨论】:

    标签: sql-server xml pivot


    【解决方案1】:

    使用 XPath/XQuery 比使用 OPENXML 可以更好地做到这一点。查看XML.nodes()XML.value() 的文档。在线查看一些 XPath 指南,this 是一个不错的指南。

    DECLARE @i XML=
    '<index>
    <doc id="0"><field name="MFG"><val>ACME</val></field><field name="InternalCode"><val /></field><field name="partnumber"><val>012345-00</val></field><field name="partdescription"><val>PIN</val></field></doc>
    <doc id="1"><field name="MFG"><val /></field><field name="InternalCode"><val>ABCDE</val></field><field name="partnumber"><val>919-555-7Z</val></field><field name="partdescription"><val>WASHER</val></field></doc>
    <doc id="2"><field name="MFG"><val>YOUR COMPANY</val></field><field name="InternalCode"><val /></field><field name="partnumber"><val>131415</val></field><field name="partdescription"><val>BOLT</val></field></doc>
    </index>';
    
    SELECT
        rowid=n.v.value('@id','VARCHAR(40)'),
        MFG=n.v.value('(field[@name="MFG"]/val)[1]','VARCHAR(40)'),
        InternalCode=n.v.value('(field[@name="InternalCode"]/val)[1]','VARCHAR(40)'),
        partnumber=n.v.value('(field[@name="partnumber"]/val)[1]','VARCHAR(40)'),
        partdescription=n.v.value('(field[@name="partdescription"]/val)[1]','VARCHAR(40)')
    FROM
        @i.nodes('/index/doc') AS n(v);
    

    结果:

    +-------+--------------+--------------+------------+-----------------+
    | rowid |     MFG      | InternalCode | partnumber | partdescription |
    +-------+--------------+--------------+------------+-----------------+
    |     0 | ACME         |              | 012345-00  | PIN             |
    |     1 |              | ABCDE        | 919-555-7Z | WASHER          |
    |     2 | YOUR COMPANY |              | 131415     | BOLT            |
    +-------+--------------+--------------+------------+-----------------+
    

    【讨论】:

      猜你喜欢
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 2013-03-14
      相关资源
      最近更新 更多