从 XML 中提取多个值并在一行中返回

Posted

技术标签:

【中文标题】从 XML 中提取多个值并在一行中返回【英文标题】:Pull multiple values from XML and return in one row 【发布时间】:2021-02-05 17:34:31 【问题描述】:

在 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    |

如果有任何帮助,我将不胜感激。

【问题讨论】:

不清楚你需要什么。请编辑您的帖子并阐明您的所需输出 【参考方案1】:

请尝试以下解决方案。

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     |
+----+-------+-------+

【讨论】:

以上是关于从 XML 中提取多个值并在一行中返回的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Perl 中的一行中提取非空白组?

如何从整数中删除最小值并在不使用字符串的情况下返回其余数字[关闭]

GrapQHL Apollo Server,提取值并在解析器中使用它们

Django提取值并在另一个页面中使它们成为占位符

从 wav 文件 python 中提取频率

来自不同数组的不同值并在表中并排附加在一起