【发布时间】:2022-01-27 06:32:48
【问题描述】:
我想知道如何从单个 XML 行中提取多个值,问题是这个 XML 值有时有重复的 (name, id, email) 标签子, 例如:
<foo>
<name>
Dacely Lara Camilo
</name>
<id>
001-1942098-2
</id>
<email>
myuncletouchme@gmail.com
</email>
</foo>
<foo>
<name>
Alba Elvira Castro
</name>
<id>
001-0327959-2
</id>
<email>
4doorsmorehorse@hotmail.com
</email>
</foo>
有时该列中的数据可能是这样的
<foo>
<name>
Nelson Antonio Jimenez
</name>
<id>
001-0329459-3
</id>
<email>
gsucastillo@tem.com
</email>
</foo>
<foo>
<name>
Emelinda Serrano
</name>
<id>
001-0261732-4
</id>
<email>
gucastillo@tem.com
</email>
</foo>
<foo>
<name>
Nelson Antonio Jimenez
</name>
<id>
001-0329259-3
</id>
<email>
gucastillo@tem.com
</email>
</foo>
<foo>
<name>
Emelinda Serrano
</name>
<id>
001-0268332-4
</id>
<email>
gucastillo@tem.com
</email>
</foo>
我希望所有这些都被转置为一行,就像这样:
我当前的代码只是提取第一对,如果有帮助的话,
WITH BASEDATA (ID, SIGNATURE, X) AS (
SELECT TOP 50
A.ID_SIGNATURE,
A.SIGNATURE,
A.XML
FROM DWH.DIM_CORE_SIGNATURE A
)SELECT
ID,
A.value('(id)[1]', 'nvarchar(max)') AS ID_SIGNATURE,
A.value('(name)[1]', 'nvarchar(max)') AS NAME,
A.value('(email)[1]', 'nvarchar(max)') AS EMAIL
FROM BASEDATA
CROSS APPLY X.nodes('//foo') AS SIGNATURE(A)
【问题讨论】:
-
提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表和 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上述#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。全部在问题内,没有图片。
-
您的 SQL 似乎工作正常,我不关注这个问题。 [dbfiddle]((dbfiddle.uk/…) (尽管我建议您选择比允许 10 亿个字符更好的数据类型...)
标签: sql sql-server xml tsql