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などで実行できるように見えますが、SQLServer内に保持することをお勧めします。SQL Serverでこのようなことをすべて実行する方法を知っている人はいますか?または、XMLをSQLサーバーに一括インポートするためのより良い方法を持っている人はいますか?

4

2 に答える 2

13

SQL Serverは、XMLを読み取り、必要に応じて挿入することができます。ここからプルされた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);
于 2012-04-29T17:32:08.100 に答える
6

これを試してみましたが、1MBのXMLファイルから975行の場合、非常に高速なPCで実行するのに約2.5分かかりました。

マルチステッププロセスでOpenXmlを使用するように切り替えましたが、プロセスにかかる時間は1秒未満です。

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を使用して処理します。

于 2015-05-21T05:23:08.320 に答える