SQL - 从多个节点提取XML

时间:2017-09-11 16:21:33

标签: sql sql-server xml

我做了很多研究,似乎无法将SQL串起来从XML字段中提取所需的数据。

<vItem>
<jobScript>
    <node guid="7606bd90-98df-4572-accd-5b41ec5605dc">
        <subNodes>
            <node guid="17f8e275-d4f6-47c0-a5e4-80da658f4097">
                <execute taskVersionGuid="5fc17d5c-7264-461f-ae38-753d703f3c99" />
            </node>
            <node guid="5fe2233c-9e3a-44be-aa20-aea2c8dcbd4a">
                <execute taskVersionGuid="f55dc069-46ff-427e-920f-5f1c3fc3ad09" />
            </node>
            <node guid="ecd6a7b5-a3be-483c-acf8-64ba1c289088">
                <execute taskVersionGuid="5220d97c-6e8f-400a-b814-aa7d84942c20" />
            </node>
        </subNodes>
    </node>
</jobScript>

我正在尝试从每个节点中提取taskVersionGuid。在这个场景中,可能有1到10个taskVersionGuids,但我上面的例子有3个。

对此有任何帮助将不胜感激。

由于

修改

我也尝试了下面的内容:

declare @XML xml

set @XML = 
'

<vItem>
    <jobScript>
        <node guid="7606bd90-98df-4572-accd-5b41ec5605dc">
            <subNodes>
                <node guid="17f8e275-d4f6-47c0-a5e4-80da658f4097">
                    <execute taskVersionGuid="5fc17d5c-7264-461f-ae38-        
753d703f3c99" />
                </node>
                <node guid="5fe2233c-9e3a-44be-aa20-aea2c8dcbd4a">
                    <execute taskVersionGuid="f55dc069-46ff-427e-920f-    
5f1c3fc3ad09" />
                </node>
                <node guid="ecd6a7b5-a3be-483c-acf8-64ba1c289088">
                    <execute taskVersionGuid="5220d97c-6e8f-400a-b814-
aa7d84942c20" />
                </node>
            </subNodes>
        </node>
    </jobScript>
</vItem>
'

select T.N.query('.')
from @XML.nodes('/vItem/jobScript/node/subNodes/node/execute') as T(N)

然而,这导致以下结果:

<execute taskVersionGuid="5fc17d5c-7264-461f-ae38-753d703f3c99" />
<execute taskVersionGuid="f55dc069-46ff-427e-920f-5f1c3fc3ad09" />
<execute taskVersionGuid="5220d97c-6e8f-400a-b814-aa7d84942c20" />

而我正试图获得taskVersionGuid的价值。

再次感谢。

2 个答案:

答案 0 :(得分:2)

回答如下:

select T.N.value('@taskVersionGuid[1]', 'uniqueidentifier')
from @XML.nodes('/vItem/jobScript/node/subNodes/node/execute') as T(N)

答案 1 :(得分:0)

您需要做的是将xml转换为表格以便查询。下面是您需要从节点中获取值的查询示例。

DECLARE @xml AS XML = '<jobScript>
<node guid="7606bd90-98df-4572-accd-5b41ec5605dc">
    <subNodes>
        <node guid="17f8e275-d4f6-47c0-a5e4-80da658f4097">
            <execute taskVersionGuid="5fc17d5c-7264-461f-ae38-753d703f3c99" />
        </node>
        <node guid="5fe2233c-9e3a-44be-aa20-aea2c8dcbd4a">
            <execute taskVersionGuid="f55dc069-46ff-427e-920f-5f1c3fc3ad09" />
        </node>
        <node guid="ecd6a7b5-a3be-483c-acf8-64ba1c289088">
            <execute taskVersionGuid="5220d97c-6e8f-400a-b814-aa7d84942c20" />
        </node>
    </subNodes>
</node>
</jobScript>'

SELECT a.value('.', 'varchar(max)')
FROM @xml.nodes('/jobScript/node/subNodes/node/execute/@taskVersionGuid') a(a)
相关问题