2012-07-04 176 views
3

我想要實現的任務是將XML文件導入SQL Server。一旦準備好空表,我會加載整個XML文件並填充該表。谷歌搜索我發現SQL批量插入是合適的,我測試了以下代碼運行正常:將XML文件導入SQL Server太慢

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有一個影響批量對象的bug。 任何提示?

+0

你最好在解析C#或其他語言的XML,並通過一個應用程序導入它。 – Oded

+0

是的,你是對的。首先嚐試使用C#導入xml,但我認爲SQL Server的批量過程更可靠 – Ras

+0

好吧,XML和關係數據庫......通常不太適合。 – Oded

回答

7

試試這個 - 我在短短53秒導入的文件從硬盤4'096紀錄(常規平均臺式機上 - 沒有高PERF服務器):

-- 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) 
+0

工程就像一個魅力,謝謝! – Ras

+1

從8小時到2秒,獲取5MB XML文件。 謝謝,先生! –

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 

13000條記錄2秒 SQL Server 2008 R2。數據庫保持兼容100

並且也嘗試數據庫保持兼容90