难以使用SQL Server TSQL解析XML

时间:2015-01-20 10:38:59

标签: sql sql-server tsql

我在将一些XML解析为我需要的表格格式时遇到了一些困难。这是我将要收到的xml的一个例子

<p>8abbdcf1-eff2-4b26-b905-343298338954</p>
<d>
    <id>172fcf08-79d6-467a-a40e-362583683680</id>
    <id>2149987c-1311-4ad0-b8bb-362477435274</id>
</d>

“p”中总会有1个元素,“d”中可以有任意数量的ID。

我希望结果将“p”应用于“d”中的每个id。我环顾四周,试图了解xml解析的工作方式,但遇到了一些困难。我的结果通常是带有单个ID的1条记录或2条记录(“d”中的元素数量),但返回的值为null。由于我还没有设法获取ID列表,我还没有继续将P应用于此。

以下是我最近的努力:

SET @InputXML = 
    '
    <p>8abbdcf1-eff2-4b26-b905-343298338954</p>
    <d>
        <id>172fcf08-79d6-467a-a40e-362583683680</id>
        <id>2149987c-1311-4ad0-b8bb-362477435274</id>
    </d>
    '
SELECT list.d.value('id[1]','nvarchar(100)') AS ID
FROM @InputXML.nodes('/d') AS list(d)

希望结果是:

p                                     |ID
8abbdcf1-eff2-4b26-b905-343298338954  |172fcf08-79d6-467a-a40e-362583683680
8abbdcf1-eff2-4b26-b905-343298338954  |2149987c-1311-4ad0-b8bb-362477435274

1 个答案:

答案 0 :(得分:1)

您需要将/id添加到您的节点函数以获取每个ID的新行,然后您可以使用.value('.','nvarchar(100)')来获取每个id节点的内部文本。这似乎按预期工作:

DECLARE @InputXML XML = 
    '<p>8abbdcf1-eff2-4b26-b905-343298338954</p>
    <d>
        <id>172fcf08-79d6-467a-a40e-362583683680</id>
        <id>2149987c-1311-4ad0-b8bb-362477435274</id>
    </d>';

SELECT  p = @InputXML.value('p[1]', 'nvarchar(100)'),
        id = list.d.value('.','nvarchar(100)')
FROM    @InputXML.nodes('d/id') AS list(d);