2012-04-29 14 views
6

szukałem w tych przykładach na Microsoft.com tutaj:masowy import XML w SQL Server

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

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

Ale to mówiąc w ramach swojego kroki kod VBScript musi być wykonany i nie byłem w stanie znaleźć miejsca, w którym powinien zostać wykonany skrypt VBScript. Czy możliwe jest wykonanie w samym Serwerze SQL?

Kod z serwisu wygląda mniej więcej tak:

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 

to wygląda to może być wykonany w klasycznej asp czy coś, ale ja wolę trzymać go wewnątrz SQL Server. Czy ktoś wie, jak wykonać coś podobnego wszystko za pomocą SQL Server? lub czy ktoś ma lepszą metodę masowego importowania XML do serwera SQL?

+0

Można użyć VB6, Visual Basic dla aplikacji IDE z pakietu Office (Word, Excel, PP itp.: Alt + F11> Wstaw> Moduł> 'Sub Test() \ n ... kod źródłowy .. \ n ') lub VbsEdit. –

+2

VBScript? Dlaczego zaczynasz od 7-letnich artykułów z bazy wiedzy i dokumentacji SQL Server 2000? Dlaczego nie zaczniesz od [tego dokumentu] (http://msdn.microsoft.com/en-us/library/ms191184 (v = sql.100) .aspx), który jest dużo nowszy, dostosowany do platformy jesteś w trakcie i zajęło około 20 sekund, aby zlokalizować jako najlepsze trafienie poprzez wyszukiwanie "importu danych zbiorczych XML na SQL Server", ostatnie zdanie w pytaniu? –

Odpowiedz

11

Program SQL Server może odczytywać kod XML i wstawiać go w razie potrzeby. Oto przykład z pliku XML i wprowadzania wyciągnął z 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> 

oświadczenie wkładkę, która jest parsowania 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

Dziękuję, to wygląda bardzo pomocne. Ale co z atrybutami takimi jak ''? –

+1

Nieważne, znalazłem to tutaj .. http://pratchev.blogspot.com/2007/06/shredding-xml-in-sql-server-2005.html Przyjrzymy się temu rozwiązaniu i spróbujemy go zaimplementować. Dziękuję Ci. –

+0

Zastanawiam się, jak to porównać z csv/bcp w wydajności. Powiedz, że rozmiar pliku wynosi kilka GB. –

3

Próbowałem to i na 975 wierszy z 1MB pliku XML, wykonanie tego na bardzo szybkim komputerze zajęło około 2,5 minuty.

Przełączyłem się na używanie OpenXml w procesie wieloetapowym, a proces zajmuje mniej niż sekundę.

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 

mam to stąd: http://www.mssqltips.com/sqlservertip/2899/importing-and-processing-data-from-xml-files-into-sql-server-tables/

Zasadniczo załadować XML do tabeli jako wielki blob tekst, a następnie użyć go do OpenXML przetwarzać.

+0

to działało dla mnie - wersja @ Ocelot20 zajęła 56 minut, aby przetworzyć mój własny plik XML, podczas gdy ta wersja zajęła kilka sekund. – Paul