【发布时间】:2020-07-10 14:33:09
【问题描述】:
我有一个非常大而且不是很漂亮的 XML,我想将它导入到我的 sql-server 数据库中。 XML的格式就像我说的很丑:
<myxml xmlns="http://somenamespace.whatever.com/schemas/xmldata/1/" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
<mydata>
<item>
<record>some</record>
<record>123</record>
<record xs:nil="true" />
<record>random</record>
<record>234</record>
</item>
<item>
<record>345</record>
<record>in all</record>
<record>these</record>
<record>cells</record>
<record>123asdf</record>
</item>
<item>
<record>how</record>
<record>to</record>
<record>import</record>
<record>987654321</record>
<record xs:nil="true" />
</item>
</mydata>
</myxml>
这只是一个小样本。事实上,XML 超过 100ML,它有超过 200k 的项目,每个项目有 15 条记录,但这个样本就可以了。
我知道“项目”中的每个“记录”代表什么,但对我来说,它足以将所有记录值导入到带有 varchar(100) 的列中。让我们说这张表:”
CREATE TABLE [dbo].[DataFromXml](
[Column1] [varchar](100) NULL,
[Column2] [varchar](100) NULL,
[Column3] [varchar](100) NULL,
[Column4] [varchar](100) NULL,
[Column5] [varchar](100) NULL
) ON [PRIMARY]
GO
我可以用这段代码完成这个:
CREATE TABLE XmlTable
(
XMLData XML
)
INSERT INTO XmlTable(XMLData)
SELECT CONVERT(XML, BulkColumn)
FROM OPENROWSET(BULK 'D:\myverylarge.xml', SINGLE_CLOB) AS x;
DECLARE @XML AS XML
SELECT @XML=XMLData FROM XmlTable
;WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema-instance' as xs, DEFAULT 'http://somenamespace.whatever.com/schemas/xmldata/1/')
INSERT INTO DataFromXml(Column1, Column2, Column3, Column4, Column5)
SELECT ref.value('record[1][not(@xs:nil = "true")]' ,'varchar(100)') as Column1
,ref.value('record[2][not(@xs:nil = "true")]' ,'varchar(100)') as Column2
,ref.value('record[3][not(@xs:nil = "true")]' ,'varchar(100)') as Column3
,ref.value('record[4][not(@xs:nil = "true")]' ,'varchar(100)') as Column4
,ref.value('record[5][not(@xs:nil = "true")]' ,'varchar(100)') as Column5
FROM @XML.nodes('/myxml/mydata/item') xmlData( ref )
这会运行一两分钟,这可能还不错。我没有很好的参考。我的感觉是,这可能会快很多,因为使用 OPENROWSET 将 XML(超过 100MB)导入数据库只需几秒钟。
我可以优化插入吗?如果可以,我该怎么做?
【问题讨论】:
-
“因为使用 OPENROWSET 将 XML(超过 100MB)放入数据库只需要几秒钟。” - 当然?或“在没有任何解析的情况下读取文件”需要几秒钟。您在那里进行了大量的处理,OPENROWSET 恕我直言不这样做。一点也不像。
-
我从来没有比较过,但你也可以试试 OpenXml()。
标签: sql-server xml tsql xquery openrowset