-1

我有下表包含一个 XML 列:

ID 标签 细节
1 测试1 <terms><destination><email>email11@foo.com</email><email>email12@foo.com</email></destination><content>blabla</content></terms>
2 测试2 <terms><destination><email>email21@foo.com</email><email>email22@foo.com</email></destination><content>blabla</content></terms>

我想要一个产生以下输出的查询:

ID 标签 目的地
1 测试1 email11@foo.com, email12@foo.com
2 测试2 email21@foo.com, email22@foo.com

关于如何将 XML 电子邮件节点值连接为相关列(Id 和 Label)的列的任何线索?提前谢谢

4

2 回答 2

1

请尝试以下解决方案。

因为没有提供 DDL 和样本数据填充,所以假设Details列是 XML 数据类型。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, Label VARCHAR(20), Details XML);
INSERT INTO @tbl (Label, Details) VALUES
('Test1',N'<terms><destination><email>email11@foo.com</email><email>email12@foo.com</email></destination><content>blabla</content></terms>'),
('Test2',N'<terms><destination><email>email21@foo.com</email><email>email22@foo.com</email></destination><content>blabla</content></terms>');
-- DDL and sample data population, end

SELECT ID, Label 
    , REPLACE(Details.query('data(/terms/destination/email/text())').value('.','VARCHAR(MAX)'), SPACE(1), ', ') AS Destination
FROM @tbl;

输出

+----+-------+----------------------------------+
| ID | Label |           Destination            |
+----+-------+----------------------------------+
|  1 | Test1 | email11@foo.com, email12@foo.com |
|  2 | Test2 | email21@foo.com, email22@foo.com |
+----+-------+----------------------------------+
于 2021-02-16T12:50:37.750 回答
1
select ID, Label,
    stuff(
        details.query('for $step in /terms/destination/email/text() return concat(", ", string($step))')
        .value('.', 'nvarchar(max)'),
    1, 2, '')
from @tbl;
于 2021-02-16T13:09:28.563 回答