【问题标题】:Retrieve specific fields of the imported to SQL Server multiple XMLs检索导入到 SQL Server 的多个 XML 的特定字段
【发布时间】:2017-11-08 15:17:06
【问题描述】:

我有多个结构相同的 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】:

    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)
    

    【讨论】:

    • 谢谢,您的魔法水晶球知道如何挖掘 XML!特别感谢您的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    相关资源
    最近更新 更多