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

问题描述 投票:1回答:1

我有多个具有相同结构的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值返回特定行号的查询数据。

问题: 如何在表中只有一行但多行时检索数据?

sql-server xml sqlxml sql-server-2017
1个回答
2
投票

FROM OPENXML与相应的SP准备和删除文档已经过时,不应再使用。而是使用适当的methods the XML data type provides

如果没有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)
© www.soinside.com 2019 - 2024. All rights reserved.