3

私が達成したいタスクは、XMLファイルをSQLServerにインポートすることです。空のテーブルを準備したら、xmlファイル全体をロードしてそのテーブルに入力します。グーグルSQL一括挿入が適切であることがわかったので、正常に実行される次のコードをテストしました。

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);

私のXMLファイルの数は約1860ノード(30kb)で、非常に小さいですが、上記の手順ではファイル全体をインポートするのに5分以上かかります。このプロセスをスピードアップするチャンスはありますか?また、SQLServer2008にはバルクオブジェクトに影響を与えるバグがあることも読みました。ヒントはありますか?

4

2 に答える 2

10

これを試してみてください - ディスクから 4,096 レコードのファイルをわずか 53 秒でインポートしました (通常の平均的なデスクトップ マシンで - 高パフォーマンスのサーバーはありません)。

-- declare XML variable
DECLARE @InputXML XML

-- import file from disk
SELECT @InputXML = CAST(x AS XML)
FROM OPENROWSET(BULK 'D:\temp\Products.xml', SINGLE_BLOB) AS T(x)

-- parse XML using XQuery and insert into the table    
INSERT INTO dbo.Products (sku, product_desc)
    SELECT 
        product.value('(SKU)[1]', 'int'),
        product.value('(Desc)[1]', 'varchar(30)')
    FROM @InputXML.nodes('Products/Product') AS X(product)
于 2012-07-04T20:28:36.113 に答える
2
declare @xml table (x xml)
--
insert @xml
select x
FROM OPENROWSET(BULK 'D:\temp\Products.xml', SINGLE_BLOB) AS T(x)

INSERT INTO dbo.Products (sku, product_desc)
SELECT
    RESULT.sku, RESULT.product_desc
FROM @xml
cross apply (
   select sku = z.value('SKU[1]', 'int'), 
          product_desc = z.value('Desc[1]','varchar(30)') 
   from x.nodes('Products/Product') Z1(z)
) RESULT 

2 秒で 13000 レコード SQL Server 2008 R2. データベース互換性 100

また、データベース互換性 90 を試してください。

于 2013-11-19T15:44:07.590 に答える