2012-04-29 70 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