在 SQL Server 中查询 XML 文档

问题描述 投票:0回答:1

我正在寻找一个 SQL Server 查询,它允许我检索表格结果中的 ReferencesValues,其中的 ParentKey 字段引用标签“* Reference”中的“key”字段。

xml:

<ReferenceType>
      <Reference>
        <Key>100000000517</Key>
        <Code>AGDS</Code>
        <Label>Member GDS / OVS</Label>
      </Reference>
      <ReferencesValues>
        <Key>200000003678</Key>
        <Code>FNGDSB</Code>
        <Label>ad1</Label>
      </ReferencesValues>
      <ReferencesValues>
        <Key>200000000221</Key>
        <Code>GDS01</Code>
        <Label>ad54</Label>
      </ReferencesValues>
    </ReferenceType>

结果示例:

    Key          Code    Label           ParentKey
    200000003678 FNGDSB   ad1            100000000517
    200000000221 GDS01   ad54            100000000517

sql sql-server xml openxml
1个回答
0
投票

唯一棘手的是获取参考父值:

DECLARE @x xml = N'<ReferenceType>
      <Reference>
        <Key>100000000517</Key>
        <Code>AGDS</Code>
        <Label>Member GDS / OVS</Label>
      </Reference>
      <ReferencesValues>
        <Key>200000003678</Key>
        <Code>FNGDSB</Code>
        <Label>ad1</Label>
      </ReferencesValues>
      <ReferencesValues>
        <Key>200000000221</Key>
        <Code>GDS01</Code>
        <Label>ad54</Label>
      </ReferencesValues>
    </ReferenceType>'

    SELECT  n.value('Key[1]', 'bigint') [key]
    ,       n.value('Code[1]', 'nvarchar(100)') code
    ,       n.value('Label[1]', 'nvarchar(100)') label
    ,       n.value('../Reference[1]/Key[1]', 'nvarchar(100)') AS parentkey
    FROM    @x.nodes('ReferenceType/ReferencesValues') t(n)

还可以进行一些优化:

    SELECT  n.value('(Key/text())[1]', 'bigint') [key]
    ,       n.value('(Code/text())[1]', 'nvarchar(100)') code
    ,       n.value('(Label/text())[1]', 'nvarchar(100)') label
    ,       n.value('(../Reference[1]/Key/text())[1]', 'nvarchar(100)') AS parentkey
    FROM    @x.nodes('ReferenceType/ReferencesValues') t(n)

或者分两步遍历xml,避免向后看:

    SELECT  n.value('(Key/text())[1]', 'bigint') [key]
    ,       n.value('(Code/text())[1]', 'nvarchar(100)') code
    ,       n.value('(Label/text())[1]', 'nvarchar(100)') label
    ,       t.value('(Reference[1]/Key/text())[1]', 'nvarchar(100)') AS parentkey
    FROM    @x.nodes('ReferenceType') t(t)
    cross apply t.nodes('ReferencesValues') n(n)
© www.soinside.com 2019 - 2024. All rights reserved.