Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将XML透视到SQL列&;价值观_Sql Server_Xml_Pivot - Fatal编程技术网

Sql server 将XML透视到SQL列&;价值观

Sql server 将XML透视到SQL列&;价值观,sql-server,xml,pivot,Sql Server,Xml,Pivot,我有一个以下格式的XML文件。并非每个字段名都有一个值。除id字段外的每个字段都将是varchar(40) 可以这样做(rowid之后的轴)吗?如果是这样,怎么做?使用XPath/XQuery比使用OPENXML做得更好。查看和上的文档。在线查看一些XPath指南,这是一个不错的指南 DECLARE @i XML= '<index> <doc id="0"><field name="MFG"><val>ACME</val></fi

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


可以这样做(rowid之后的轴)吗?如果是这样,怎么做?

使用XPath/XQuery比使用OPENXML做得更好。查看和上的文档。在线查看一些XPath指南,这是一个不错的指南

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);
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
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            |
+-------+--------------+--------------+------------+-----------------+