首页 > 解决方案 > 从 XML 中提取多个值并在一行中返回

问题描述

在 SQL Server 上,我在记录上有一个 XML 字段,它包含多个相似类型的节点,但具有不同的 ID。
我想从该 XML 中提取一些 ID 并返回一行。

下面是一个简单的 XML 示例:

...
<Items>
  <Item>
     <ItemID>1</ItemID>
     <ItemValue>A</ItemValue>
  </Item>
  <Item>
    <ItemID>2</ItemID>
     <ItemValue>B</ItemValue>
  </Item>
</Items>

我想在一行上输出我正在搜索的特定项目的值。

就像是

select XML_Values 
from the_table
where conditions_met = true

我使用了交叉应用,可以只返回所需值的节点,但输出都在单独的行上。理想情况下,Id 喜欢的输出类似于以下内容:

| Id=1  | Id=2 | (Column headers)
| A     | B    |

我会非常感谢任何帮助。

标签: sql-serverxmlnodes

解决方案


请尝试以下解决方案。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML);
INSERT INTO @tbl (xmldata) VALUES
(N'<Items>
    <Item>
        <ItemID>1</ItemID>
        <ItemValue>A</ItemValue>
    </Item>
    <Item>
        <ItemID>2</ItemID>
        <ItemValue>B</ItemValue>
    </Item>
</Items>');
-- DDL and sample data population, end

SELECT ID
    , c.value('(Item[1]/ItemValue/text())[1]','VARCHAR(30)') AS Item1
    , c.value('(Item[2]/ItemValue/text())[1]','VARCHAR(30)') AS Item2
FROM @tbl
    CROSS APPLY xmldata.nodes('/Items') AS t(c);

输出

+----+-------+-------+
| ID | Item1 | Item2 |
+----+-------+-------+
|  1 | A     | B     |
+----+-------+-------+

推荐阅读