OPENXML 使用元素和属性名称获取内容

Fla*_*Man 6 xml sql-server

在此 SQL Server OPENXML 示例中:

declare @xmldata xml    

set @xmldata = 
'<?xml version="1.0"?>
<wddxPacket version="1.0">
    <data>
        <var dimension="task"><string>Task 1</string></var>
        <var dimension="startdate"><string>2020-11-14</string></var>
    </data>
    <data>
        <var dimension="startdate"><string>2020-11-15</string></var>
        <var dimension="task"><string>Task 2</string></var>
    </data>
</wddxPacket>'

DECLARE @hDoc int
EXEC sp_xml_preparedocument @hDoc OUTPUT, @xmldata

SELECT *
FROM OPENXML(@hDoc, '//wddxPacket/data',2)
        WITH(
            task          varchar(200) 'var[1]/string',
            startdate     varchar(200) 'var[2]/string'
    )

EXEC sp_xml_removedocument @hDoc
Run Code Online (Sandbox Code Playgroud)

这是当前的输出:

task         startdate
------       ----------
Task 1       2020-11-14
2020-11-15   Task 2   
Run Code Online (Sandbox Code Playgroud)

但我真的想要这个输出:

task         startdate
------       ----------
Task 1       2020-11-14
Task 2       2020-11-15
Run Code Online (Sandbox Code Playgroud)

为了识别内容,我不能单独使用“var”,因为所有感兴趣的元素都被命名为“var”。我不能使用位置 [1] 或 [2],因为位置编号在 XML 中不一致,导致当前输出混淆。如何根据“var”和“task”或“startdate”的“dimension”属性名称识别元素?

Dav*_*oft 8

您需要使用不同的XPath表达式来匹配属性值,例如var[@dimension="task"]/string.

像这样:

declare @xmldata xml    

set @xmldata = 
'<?xml version="1.0"?>
<wddxPacket version="1.0">
    <data>
        <var dimension="task"><string>Task 1</string></var>
        <var dimension="startdate"><string>2020-11-14</string></var>
    </data>
    <data>
        <var dimension="startdate"><string>2020-11-15</string></var>
        <var dimension="task"><string>Task 2</string></var>
    </data>
</wddxPacket>'

DECLARE @hDoc int
EXEC sp_xml_preparedocument @hDoc OUTPUT, @xmldata

SELECT *
FROM OPENXML(@hDoc, '/wddxPacket/data',2)
        WITH(
            task          varchar(200) 'var[@dimension="task"]/string',
            startdate     varchar(200) 'var[@dimension="startdate"]/string'
    )

EXEC sp_xml_removedocument @hDoc
Run Code Online (Sandbox Code Playgroud)

产出

task    startdate
------- ------------
Task 1  2020-11-14
Task 2  2020-11-15
Run Code Online (Sandbox Code Playgroud)