我有一个xml变量,我想把这个输入xml粉碎成关系表输出,如下所示
declare @x xml
set @x =
'<groupNodes>
<groupSet name="groupset1" id="10001">
<condition id="7">contains</contains>
<group name="group11" id="11">100</group>
<group name="group12" id="19">460</group>
<group name="group13" id="24">450</group>
<group name="group14" id="23">440</group>
</groupSet>
<groupSet name="groupset2" id="10002">
<condition id="3">equals</contains>
<group name="group21" id="21">370</group>
<group name="group22" id="27">543</group>
</groupSet>
<groupSet name="groupset3" id="10003">
<condition id="7">contains</contains>
<group name="group31" id="31">760</group>
<group name="group32" id="38">450</group>
<group name="group33" id="39">420</group>
..
..
</groupSet>
..
</groupNodes>'
输出
groupSetName groupSetId groupName groupId groupValue conditionId
------------- ------------ --------------------------------------
groupset1 1001 group11 11 100 7
groupset1 1001 group12 19 460 7
groupset1 1001 group13 24 450 3
groupset1 1001 group14 23 440 3
groupset2 1002 group21 21 370 3
groupset2 1002 group22 27 543 3
groupset3 1003 group31 31 760 7
groupset3 1003 group32 38 450 7
groupset3 1003 group33 39 420 7
我正在尝试下面的内容,它只给出每个子节点的第一行,而不是所有子节点都来了。还可以进行groupset和group columns。无法做条件节点。
select
tab.col.value('(@name)[1]', 'nvarchar(100)') groupSetName,
tab.col.value('(@id)[1]', 'nvarchar(100)') groupSetId,
tab.col.value('(./group/@name)[1]', 'nvarchar(100)') groupId,
tab.col.value('(./group/@id)[1]', 'nvarchar(100)') groupName,
tab.col.value('(./group)[1]', 'nvarchar(100)') groupValue
from @x.nodes('groupNodes/groupSet') as tab(col)
有人可以帮助我。我非常努力,无法理解。
答案 0 :(得分:1)
试试这个。
select
tab.col.value('../@id', 'nvarchar(100)') groupsetName,
tab.col.value('../@name', 'nvarchar(100)') groupsetId,
tab.col.value('@id', 'nvarchar(100)') groupname,
tab.col.value('@name', 'nvarchar(100)') groupID,
tab.col.value('.', 'nvarchar(100)') groupValue,
tab.col.value('(../condition/@id)[1]','int')
from @x.nodes('groupNodes/groupSet/group') as tab(col)