检索导入到 SQL Server 的多个 XML 的特定字段

迈克 B。

我有多个具有相同结构的 XML 文件,我已使用以下命令将它们导入SQL Server 2017

DDL:

CREATE DATABASE xmlFiles
GO

USE xmlFiles
CREATE TABLE tblXMLFiles (IntCol int, XmlData xml);
GO

DML:

USE xmlFiles
INSERT INTO [dbo].[tblXMLFiles](XmlData) SELECT * FROM OPENROWSET(BULK 'C:\xmls\1.xml', SINGLE_BLOB) AS x;
INSERT INTO [dbo].[tblXMLFiles](XmlData) SELECT * FROM OPENROWSET(BULK 'C:\xmls\2.xml', SINGLE_BLOB) AS x;
…
INSERT INTO [dbo].[tblXMLFiles](XmlData) SELECT * FROM OPENROWSET(BULK 'C:\xmls\N.xml', SINGLE_BLOB) AS x;

现在我想查询数据:

USE xmlFiles
GO

DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)

SELECT @XML = XmLData FROM tblXMLFiles

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML

SELECT Surname , GivenNames
FROM OPENXML(@hDoc, 'article/ref-list/ref/mixed-citation')
WITH 
(
    Surname [varchar](100) 'string-name/surname',
    GivenNames [varchar](100) 'string-name/given-names'
)

EXEC sp_xml_removedocument @hDoc
GO

查询正在运行,但问题是它仅在数据源表中只有一行时才返回数据 — tblXMLFiles如果我添加多于一行,我会得到空的结果集。

重要提示:
如果我将语句添加到外部SELECT子句 (SELECT @XML = XmLData…) 中TOP,则情况会发生变化,然后它会根据TOP返回特定行号的查询数据

问题:
如何不仅在表中有一行而且在多行时检索数据?

修吾

FROM OPENXML使用相应的 SP 准备和删除文档已过时,不应再使用。而是使用XML 数据类型提供的适当方法

如果没有您的 XML 示例,很难提供解决方案,但我的魔法水晶球告诉我,它可能是这样的:

SELECT f.IntCol 
      ,mc.value('(string-name/surname)[1]','nvarchar(max)') AS Surname
      ,mc.value('(string-name/given-names)[1]','nvarchar(max)') AS GivenNames
FROM dbo.tblXMLFiles AS f
OUTER APPLY f.XmlData.nodes('article/ref-list/ref/mixed-citation') AS A(mc)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章