我想从多个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 secondary_table),但是,我认为这不是必需的,并且可以实现更直接的解决方案。
如何在不使用游标的情况下,将通过SELECT查询获得的多个XML文件中的数据提取到单个结果集中?
FILE_NAME || Value 1 || Value 2 || ...
----------------------------------------------
XML_FILE_1 || Node1Value || Node2Value || ...
XML_FILE_2 || Node1Value || Node2Value || ...
可以肯定的CURSOR
是,这种方法是不需要的,完全是错误的...
一般的方法应该是这样的:
SELECT
b.value('(./SomeNode/text())[1]','nvarchar(100)') as [Some_Text],
b.value('(./SomeOtherNode/@VAL)[1]','int') as [Some_Val]
FROM [SOME_TABLE]
CROSS APPLY [XML_FILE].nodes('Example/File') as a(b);
但是还有很多问题:
CONVERT
广泛使用...您将需要本机XML才能使用.nodes()
OUTER APPLY
代替CROSS APPLY
。为了演示运行的独立模型:
DECLARE @mockup TABLE(ID INT IDENTITY, [XML_FILE] XML);
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 [XML_FILE].nodes('Example/File') as a(b)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句