2012-04-29 44 views
6

yo estaba buscando en estos ejemplos en Microsoft.com aquí:XML importación masiva en SQL Server

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

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

Pero se está diciendo en parte de ella a unos pasos de ese código VBScript tiene que ser ejecutada , y no pude encontrar dónde debe ejecutarse VBScript. ¿Se puede ejecutar en SQL Server?

El código del sitio se ve algo como esto:

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 

Esto parece que podría ser ejecutado en ASP clásico o algo, pero prefiero mantenerlo dentro de SQL Server. ¿Alguien sabe cómo ejecutar algo como esto todo en SQL Server? o alguien tiene un mejor método para importar XML a granel en el servidor SQL?

+0

Puede usar VB6, Visual Basic para Aplicaciones IDE de Office (Word, Excel, PP, etc.): Alt + F11> Insertar> Módulo> 'Sub Test() \ n ... código fuente .. \ n Fin Sub ') o VbsEdit. –

+2

VBScript? ¿Por qué comienzas con artículos de KB de 7 años y documentación de SQL Server 2000? ¿Por qué no comenzarías en [este documento] (http://msdn.microsoft.com/en-us/library/ms191184 (v = sql.100) .aspx), que es mucho más reciente, adaptado a la plataforma en realidad está encendido, y tardó unos 20 segundos en ubicarse como el mejor golpe a través de una búsqueda de "XML de importación masiva en SQL Server", la última frase en su pregunta? –

Respuesta

11

SQL Server es capaz de leer XML e insertarlo como lo necesite. Aquí está un ejemplo de un archivo XML e inserción sacado de here:

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> 

sentencia Insert que está analizando el 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

Gracias, esto se ve muy útil. Pero ¿qué tal para atributos como ''? –

+1

No importa, lo encontré aquí ... http://pratchev.blogspot.com/2007/06/shredding-xml-in-sql-server-2005.html Veremos esta solución e intentaremos implementarla. Gracias. –

+0

Me pregunto cómo se compara con csv/bcp en el rendimiento. Digamos que para un tamaño de archivo de algunos GB. –

3

Probé esto y por 975 filas de un archivo XML de 1MB, esto tomó aproximadamente 2.5 minutos para ejecutarse en una PC muy rápida.

Cambié a usar OpenXml en un proceso de varios pasos y el proceso lleva menos de un segundo.

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 

Tengo esto de aquí: http://www.mssqltips.com/sqlservertip/2899/importing-and-processing-data-from-xml-files-into-sql-server-tables/

Básicamente se carga el XML en una tabla como una gran mancha de texto, a continuación, utiliza OpenXml para procesarlo.

+0

esto funcionó para mí - @ Ocelot20 versión tomó 56 minutos para procesar mi propio archivo XML, mientras que esta versión tomó unos segundos. – Paul

Cuestiones relacionadas