2012-04-29 69 views
6

我一直在尋找在Microsoft.com上的這些例子在這裏:批量導入XML到SQL Server

http://support.microsoft.com/kb/316005

http://msdn.microsoft.com/en-us/library/aa225754%28v=sql.80%29.aspx

但它說在它的一部分這麼VBScript代碼必須被執行的步驟,我無法找到VBScript應該在哪裏執行。是否有可能在SQL Server本身中執行?

從網站的代碼看起來是這樣的:

Set objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkLoad") 
objBL.ConnectionString = "provider=SQLOLEDB.1;data source=MySQLServer; 
          database=MyDatabase;uid=MyAccount;pwd=MyPassword" 
objBL.ErrorLogFile = "c:\error.log" 
objBL.Execute "c:\customermapping.xml", "c:\customers.xml" 
Set objBL = Nothing 

這看起來可能在傳統的ASP或東西來執行,但我更願意把它的SQL Server中。有沒有人知道如何執行這樣的東西 - 在SQL Server中?或沒有人有更好的方法批量導入到SQL服務器的XML?

+0

您可以從Office(Word,Excel,PP等)使用VB6,Visual Basic for Applications IDE:Alt + F11>插入>模塊> Sub Test()\ n ...源代碼.. \ n End Sub ')或VbsEdit。 –

+2

VBScript?爲什麼從7年前的KB文章和SQL Server 2000文檔開始?你爲什麼不從[本文檔](http://msdn.microsoft.com/en-us/library/ms191184(v = sql.100).aspx)開始,這更爲新近,面向平臺你實際上,並花了大約20秒,通過搜索「批量導入XML到SQL Server」,您的問題中的最後一句搜索找到最高的命中? –

回答

11

SQL Server能夠讀取XML並根據需要插入它。下面是一個XML文件,並插入從here拉昇的例子:

XML:

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

謝謝,這看起來非常有幫助。但是對於像'這樣的屬性怎麼樣? –

+1

沒關係,在這裏找到它.. http://pratchev.blogspot.com/2007/06/shredding-xml-in-sql-server-2005.html將看看這個解決方案,並嘗試實現它。謝謝。 –

+0

我想知道這是如何比較csv/bcp的性能。說幾GB的文件大小。 –

3

我想這和975行從:正在解析XML

<Products> 
    <Product> 
    <SKU>1</SKU> 
    <Desc>Book</Desc> 
    </Product> 
    <Product> 
    <SKU>2</SKU> 
    <Desc>DVD</Desc> 
    </Product> 
    <Product> 
    <SKU>3</SKU> 
    <Desc>Video</Desc> 
    </Product> 
</Products> 

Insert語句一個1MB的XML文件,這花了大約2.5分鐘在一個非常快的PC上執行。

我在一個多步驟的過程中切換到使用OpenXml,並且過程不到一秒鐘。

CREATE TABLE XMLwithOpenXML 
(
    Id INT IDENTITY PRIMARY KEY, 
    XMLData XML, 
    LoadedDateTime DATETIME 
)  

INSERT INTO XMLwithOpenXML(XMLData, LoadedDateTime) 
SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE() 
FROM OPENROWSET(BULK 'clients.xml', SINGLE_BLOB) AS x; 



DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)  

SELECT @XML = XMLData FROM XMLwithOpenXML WHERE ID = '1' -- The row to process  

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML 


INSERT INTO Clients 
SELECT CustomerID, CustomerName 
FROM OPENXML(@hDoc, 'Clients/Client') 
WITH 
(
    CustomerID [varchar](50) 'ID', 
    CustomerName [varchar](100) 'Name' 
) 


EXEC sp_xml_removedocument @hDoc 
GO 

我得到這個從這裏: http://www.mssqltips.com/sqlservertip/2899/importing-and-processing-data-from-xml-files-into-sql-server-tables/

基本上你的XML加載到一個表作爲文本的大斑點,然後使用OPENXML來處理它。

+0

這爲我工作 - @ Ocelot20版本花了56分鐘來處理我自己的XML文件,而這個版本花了幾秒鐘。 – Paul