我在将一些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
答案 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);