难以用 SQL 服务器 TSQL 解析 XML
Difficulty parsing XML with SQL Server TSQL
我在将某些 XML 解析为我需要的 table 格式时遇到了一些困难。这是 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" 中的元素数),但返回的值为空。由于我还没有设法获得 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
您需要将 /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);
我在将某些 XML 解析为我需要的 table 格式时遇到了一些困难。这是 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" 中的元素数),但返回的值为空。由于我还没有设法获得 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
您需要将 /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);