我正在尝试使用sql server将xml值转换为表。
从这个xml值和sql查询
<ROOT>
<NODE1>
<VALUE>NODE1_VALUE1</VALUE>
</NODE1>
<NODE1>
<VALUE>NODE1_VALUE2</VALUE>
<NODE2>
<VALUE>NODE1_NODE2_VALUE1</VALUE>
</NODE2>
<NODE2>
<VALUE>NODE1_NODE2_VALUE2</VALUE>
</NODE2>
</NODE1>
</ROOT>
SELECT NODE1.C.VALUE('VALUE[1]','VARCHAR(MAX)') NODE1_VALUE
,NODE2.C.VALUE('VALUE[1]','VARCHAR(MAX)') NODE2_VALUE
FROM TABLENAME T
CROSS APPLY T.TEXT.NODES('/ROOT/NODE1') NODE1(C)
CROSS APPLY T.TEXT.NODES('/ROOT/NODE1/NODE2') NODE2(C)
我收到了这个结果,但是NODE1_NODE2_VALUE1不是NODE1_VALUE1的孩子。
NODE1_VALUE NODE2_VALUE
==================================
NODE1_VALUE1 NODE1_NODE2_VALUE1
NODE1_VALUE1 NODE1_NODE2_VALUE2
NODE1_VALUE2 NODE1_NODE2_VALUE1
NODE1_VALUE2 NODE1_NODE2_VALUE2
但我需要以下结果。如何更改sql查询以获得此结果?
NODE1_VALUE NODE2_VALUE
==================================
NODE1_VALUE1 NULL
NODE1_VALUE2 NODE1_NODE2_VALUE1
NODE1_VALUE2 NODE1_NODE2_VALUE2
(OR)
NODE1_VALUE NODE2_VALUE
==================================
NODE1_VALUE2 NODE1_NODE2_VALUE1
NODE1_VALUE2 NODE1_NODE2_VALUE2
答案 0 :(得分:0)
DECLARE @x XML = N'
<ROOT>
<NODE1>
<VALUE>NODE1_VALUE1</VALUE>
</NODE1>
<NODE1>
<VALUE>NODE1_VALUE2</VALUE>
<NODE2>
<VALUE>NODE1_NODE2_VALUE1</VALUE>
</NODE2>
<NODE2>
<VALUE>NODE1_NODE2_VALUE2</VALUE>
</NODE2>
</NODE1>
</ROOT>'
SELECT t.c.value('(VALUE/text())[1]', 'VARCHAR(MAX)')
, t2.c2.value('(VALUE/text())[1]', 'VARCHAR(MAX)')
FROM @x.nodes('//NODE1') t (c)
OUTER APPLY t.c.nodes('NODE2') t2 (c2)