sql - 如何从 SQL Server 中的多个 XML 文件读取数据?

标签 sql sql-server xml t-sql

背景:

我想从多个 XML 文件(存储在数据库中)获取数据并将它们提取到一个结果集中。使用单个 XML 文件的基本工作解决方案与此类似:

DECLARE @xml xml
SET @xml = 
(SELECT TOP 1 convert(varchar(max), convert(varbinary(max), [XML_FILE]))
  FROM [SOME_TABLE])
SELECT
    b.value('(./SomeNode/text())[1]','nvarchar(100)')) as [Some_Text],
    b.value('(./SomeOtherNode/@VAL)[1]','int')) as [Some_Val]
FROM @xml.nodes('Example/File') as a(b)

显然,这不适用于返回许多行(许多 XML 文件)的 SELECT。可以使用游标来实现次优解决方案(迭代集合 -> 将数据推送到临时表 -> SELECT (*) FROM tempor_table),但是,我相信这不是必需的,可以实现更直接的解决方案。

问题:

如何在不使用游标的情况下将通过 SELECT 查询获得的多个 XML 文件中的数据提取到单个结果集中?

FILE_NAME ||   Value 1   ||   Value 2  || ...
----------------------------------------------
XML_FILE_1 || Node1Value || Node2Value || ...
XML_FILE_2 || Node1Value || Node2Value || ...

最佳答案

感谢@Shnugo 的回答,我找到了解决方案。

如果 xml-container 列的类型与 XML MS-SQL 专用列的类型不同,则应执行双重 CROSS APPLY。下面的例子:

DECLARE @mockup TABLE(ID INT IDENTITY, [XML_DATA] VARBINARY(MAX));
INSERT INTO @mockup VALUES('<Example><File><SomeNode>blah</SomeNode><SomeOtherNode VAL="1"/></File></Example>')
                         ,('<Example><File><SomeNode>blub</SomeNode><SomeOtherNode VAL="2"/></File></Example>')

SELECT
    ID,
    b.value('(SomeNode/text())[1]','nvarchar(100)') as [Some_Text],
    b.value('(SomeOtherNode/@VAL)[1]','int') as [Some_Val]
FROM @mockup
CROSS APPLY (SELECT CAST(convert(varbinary(max), [XML_DATA]) as XML)) as RAW_XML(xml_field)
CROSS APPLY RAW_XML.xml_field.nodes('Example/File') as a(b) 

关于sql - 如何从 SQL Server 中的多个 XML 文件读取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54183550/

相关文章:

c# - XmlWriter 使命名空间不正确

sql - 如何在 SQL LIKE 查询中跳过特定字符

mysql - 为什么选择 group by 上的所有列不会导致错误?

sql - 如何有效地反转多对多 SQL 查询?

sql-server - 针对全文索引的混合查询

sql - 如何从 SQL Server 中删除图表支持对象?

c# - 通过条目获取条目

c# - EF Core 事务顺序和外键约束

c# - 使用 XPATH 从 XML 文档中选择特定值?

Java+ jackson +XML : serialize a java object properties as XML elements with same names