Вопрос по sql-server, sql, sql-server-2008 – Массовый импорт XML в SQL Server

6

Я смотрел на эти примеры на Microsoft.com здесь:

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? или у кого-нибудь есть лучший метод для массового импорта XML на SQL-сервер?

Вы можете использовать VB6, Visual Basic для приложений IDE из Office (Word, Excel, PP и т. Д.: Alt + F11 & gt; Вставить & gt; Модуль & gt;Sub Test()\n ... source code .. \nEnd Sub) или VbsEdit. Bogdan Sahlean
VBScript? Почему вы начинаете с 7-летних статей базы знаний и документации по SQL Server 2000? Почему бы вам не начать сthis document, который является более недавним, ориентирован на платформу, на которой вы фактически находитесь, и потребовалось около 20 секунд, чтобы определить его как наиболее популярное с помощью поиска «массового импорта XML в SQL Server», последнего предложения в вашем вопросе? Aaron Bertrand

Ваш Ответ

2   ответа
12

Вот пример файла XML и вставки, извлеченной изВот:

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>

Вставьте оператор, который анализирует 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);
Мне интересно, как это сравнить с CSV / BCP по производительности. Скажем, размер файла несколько ГБ.
Спасибо, это выглядит очень полезным. Но как насчет таких атрибутов, как<product id="123"> ? Control Freak
Неважно, нашел это здесь ..pratchev.blogspot.com/2007/06/…  Посмотрим на это решение и попробуем его реализовать. Спасибо. Control Freak
FWIW - В моей ситуации этот процесс казался исключительно медленным и интенсивным процессором. Ниже я нашел более быстрый подход только для SQL.
3

и для 975 строк из XML-файла размером 1 МБ это заняло около 2,5 минут для выполнения на очень быстром ПК.

Я перешел на использование 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 для его обработки.

у меня это сработало - @ Ocelot20 версия заняла 56 минут, чтобы обработать мой собственный XML-файл, тогда как эта версия заняла несколько секунд.

Похожие вопросы