我有下面的 XML,我成功地从 cmpD 节点汇出所有值。然而,我遇到的问题是如何提取<bend>
出现在适当dtl
节点中的相关值。
这是当前产生的结果:
当前结果
cmp cmpAmt cmpCode
B 1 A
C 9 A
G 2 A
F 1 A
F 1 L
这就是我想要得到的结果,但是<bend>
在<Dtl>
.
有谁知道如何做到这一点?
预期结果
cmp cmpAmt cmpCode bend
B 1 A A
C 9 A A
G 2 A A
F 1 A Z
F 1 L Z
我目前拥有的:
DECLARE @XML XML = '
<Dtl>
<Type>R</Type>
<bend>A</bend>
<cmpD>
<cmp>B</cmp>
<cmpAmt>1</cmpAmt>
<cmpCode>A</cmpCode>
</cmpD>
<cmpD>
<cmp>C</cmp>
<cmpAmt>9</cmpAmt>
<cmpCode>A</cmpCode>
</cmpD>
<cmpD>
<cmp>G</cmp>
<cmpAmt>2</cmpAmt>
<cmpCode>A</cmpCode>
</cmpD>
</Dtl>
<Dtl>
<Type>R</Type>
<bend>Z</bend>
<cmpD>
<cmp>F</cmp>
<cmpAmt>1</cmpAmt>
<cmpCode>A</cmpCode>
</cmpD>
<cmpD>
<cmp>F</cmp>
<cmpAmt>1</cmpAmt>
<cmpCode>L</cmpCode>
</cmpD>
</Dtl>'
和 SQL:
select
b.value('(cmp/text())[1]','nvarchar(max)'),
b.value('(cmpAmt/text())[1]','nvarchar(max)'),
b.value('(cmpCode/text())[1]','nvarchar(max)')
from
@XML.nodes('/Dtl/cmpD') AS A(b)
uj5u.com热心网友回复:
你可以先切碎的DTL
节点,然后哺养到另一个.nodes
使用cross apply
碎化的cmpD
节点:
select
x2.cmpD.value('(cmp/text())[1]','nvarchar(max)'),
x2.cmpD.value('(cmpAmt/text())[1]','nvarchar(max)'),
x2.cmpD.value('(cmpCode/text())[1]','nvarchar(max)'),
x1.dtl.value('(bend/text())[1]','nvarchar(max)')
from
@XML.nodes('/Dtl') x1(dtl)
cross apply x1.dtl.nodes('cmpD') AS x2(cmpD);
数据库<>小提琴
注二等如何.nodes
指的是第一次,也不会使用领先/
。
我建议你重新考虑列的型别和长度,他们真的都需要
nvarchar(max)
吗?
0 评论