检索导入到 SQL 服务器的多个 XML 的特定字段
Retrieve specific fields of the imported to SQL Server multiple XMLs
我有多个具有相同结构的 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.xml', SINGLE_BLOB) AS x;
INSERT INTO [dbo].[tblXMLFiles](XmlData) SELECT * FROM OPENROWSET(BULK 'C:\xmls.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
查询正常,但问题是它 returns 仅当数据源中只有一行时才显示数据 table — tblXMLFiles
。如果我添加多行,我得到空结果集。
重要提示:
如果我在外层SELECT
子句(SELECT @XML = XmLData…
)中加入TOP
语句,那么它returns具体行号的查询数据,根据TOP
值。
问题:
如何在 table 中不仅只有一行而且还有很多行的情况下检索数据?
FROM OPENXML
用相应的SP准备和删除一个文件已经过时,不应该再使用了。而是使用适当的 methods the XML data type provides。
没有你的例子 XML 很难提供解决方案,但我的魔法 crystal 球告诉我,它可能是这样的:
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 文件,我已使用以下命令将它们导入 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.xml', SINGLE_BLOB) AS x;
INSERT INTO [dbo].[tblXMLFiles](XmlData) SELECT * FROM OPENROWSET(BULK 'C:\xmls.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
查询正常,但问题是它 returns 仅当数据源中只有一行时才显示数据 table — tblXMLFiles
。如果我添加多行,我得到空结果集。
重要提示:
如果我在外层SELECT
子句(SELECT @XML = XmLData…
)中加入TOP
语句,那么它returns具体行号的查询数据,根据TOP
值。
问题:
如何在 table 中不仅只有一行而且还有很多行的情况下检索数据?
FROM OPENXML
用相应的SP准备和删除一个文件已经过时,不应该再使用了。而是使用适当的 methods the XML data type provides。
没有你的例子 XML 很难提供解决方案,但我的魔法 crystal 球告诉我,它可能是这样的:
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)