我正在寻找一个 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
唯一棘手的是获取参考父值:
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)