我想要实现的任务是将XML文件导入SQL Server。准备好空表后,我将加载整个xml文件并填充该表。谷歌搜索我发现SQL批量插入是合适的,所以我测试了以下运行良好的代码:
INSERT INTO Products (sku, product_desc)
SELECT X.product.query('SKU').value('.', 'INT'),
X.product.query('Desc').value('.', 'VARCHAR(30)')
FROM (
SELECT CAST(x AS XML)
FROM OPENROWSET(
BULK 'C:\Products.xml',
SINGLE_BLOB) AS T(x)
) AS T(x)
CROSS APPLY x.nodes('Products/Product') AS X(product);
我的XML文件大约有1860个节点(30kb),非常小,但上述过程需要5分钟才能导入整个文件。有没有机会参与这个过程? 我还读到SQL Server 2008有一个影响批量对象的错误。 任何提示?
答案 0 :(得分:7)
试试这个 - 我在53秒内从磁盘导入了一个包含4'096条记录的文件(在常规平均台式机上 - 没有高性能服务器):
-- declare XML variable
DECLARE @InputXML XML
-- import file from disk
SELECT @InputXML = CAST(x AS XML)
FROM OPENROWSET(BULK 'D:\temp\Products.xml', SINGLE_BLOB) AS T(x)
-- parse XML using XQuery and insert into the table
INSERT INTO dbo.Products (sku, product_desc)
SELECT
product.value('(SKU)[1]', 'int'),
product.value('(Desc)[1]', 'varchar(30)')
FROM @InputXML.nodes('Products/Product') AS X(product)
答案 1 :(得分:2)
declare @xml table (x xml)
--
insert @xml
select x
FROM OPENROWSET(BULK 'D:\temp\Products.xml', SINGLE_BLOB) AS T(x)
INSERT INTO dbo.Products (sku, product_desc)
SELECT
RESULT.sku, RESULT.product_desc
FROM @xml
cross apply (
select sku = z.value('SKU[1]', 'int'),
product_desc = z.value('Desc[1]','varchar(30)')
from x.nodes('Products/Product') Z1(z)
) RESULT
2秒内13000条记录 SQL Server 2008 R2。数据库兼容性100
另外,请尝试数据库兼容性90