避免从sql server复制xml数据

时间:2016-07-21 04:59:00

标签: sql-server xml

我正在尝试使用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

1 个答案:

答案 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)