2012-02-06 29 views
1

を挿入します。バルクは、私は次のようなXML構造を持つXML RAWデータからのSQL Server 2008 R2へ

<tables> 
    <table name="tableName1"> 
    <row ID="34" col1="data" col2="dom" /> 
    <row ID="35" col1="data2" col2="dom2" /> 
    </table> 
    <table name="tableName2"> 
    <row ID="1" col1="data" col2="dom" col3="item1" /> 
    <row ID="3" col1="data2" col2="dom2" col3="item2" /> 
    <row ID="7" col1="data4" col3="item3" /> 
    </table> 
    ... 
<tables> 

基本的には、テーブルノードがFOR XML RAWを選択して作成したRAWデータが含まれています。

今私は逆を行いたい:XMLを読んで、SQL Server 2008 R2のデータベースの各テーブルにデータを挿入します。しかし、私はロード・プロセスが堅牢であることを願っています。つまり、将来変更される場合は、列名と表名を混乱させたくありません。テーブルノードの属性@nameからテーブル名を読み込み、<Row>ノードの属性で指定されたカラムにデータを挿入するプロセスが必要です。私は入力としてXMLを取得し、残りを行うストアドプロシージャを考えました。

データの量は約です。 10〜30 000行の70個のテーブル、合計100 000個の行。私は可能な限り効率的にそれを行う必要があり、一括読み込みは最高です。

XML内のテーブルの順序が構築されているため、外部キーを処理してはいけません。そのため、FK制約は、1つのテーブルを別のテーブルにロードして保持することができます。

は、しかし、私は前に、各テーブルを処理した後

SET Identity_Insert ON and SET Identity_Insert OFF 

を行う必要があり、各テーブルにID列があります。また、すべての行を挿入した後に各テーブルを再配置する必要があります。ああ、私は何かがうまくいかない場合は、私がロールバックできるようにトランザクションでシバン全体を行う必要があります。

どっちあなたは私が行くお勧めします:私は、T-SQLに滞在またはCLR SQLでSPを書いてみる必要がありますか? XQueryを使用するか、一部の一括挿入メソッドを使用できますか?

ありがとうございました!

答えて

1

あなたはかなり大きなXML文書を処理しているように、私が使用するには、この時点ではお勧めします。ネットシュレッダー。これは、CLRプロシージャまたは外部ツールで実行できます。 SQL Serverのxqueryでビルドを使用することもできますが、それは遅くなります。

しかし、これとあなたの前の質問(Dump data into single XML file from MS SQL Server 2008 R2)を見て、私はあなたがBCPユーティリティ、あるいは複製のようなものを使用する方がよいかもしれません考えています。あなたの正確な要件は何ですか?

+0

SQLBulkCopyクラスが必要でした。データを高速に処理でき、適切なオプションで安全です。アイデアをありがとう。 – Daniel

2

基本的に、あなたのXMLをループしており、結果セットに基づいてクエリを記述します。

することを開始するために、これを試してみてください:

declare @i int; 
declare @x xml; 

------ 
SELECT @x = N' 
<tables> 
    <table name="tableName1"> 
    <row ID="34" col1="data" col2="dom" /> 
    <row ID="35" col1="data2" col2="dom2" /> 
    </table> 
    <table name="tableName2"> 
    <row ID="1" col1="data" col2="dom" col3="item1" /> 
    <row ID="3" col1="data2" col2="dom2" col3="item2" /> 
    <row ID="7" col1="data4" col3="item3" /> 
    </table> 
</tables>'; 


exec sp_xml_preparedocument @i output, @x 


select ID, col1, col2 
from OpenXml(@i, '/tables/table/row') 
with (ID int, col1 nvarchar(30), col2 nvarchar(30)) 

exec sp_xml_removedocument @i 

それはあなたが(あなただけのSQLを変更、前にテーブル名1つのレベルを取得することができます)

34 data dom 
35 data2 dom2 
1 data dom 
3 data2 dom2 
7 data4 NULL 
にデータをはめ込むために必要な列のリストを取得します

次に実行する必要があるのは、この結果セットでループするステートメントです。

FYI、あなたは、このようなファイルから読み取ることができ、XMLを記述する必要はありません。

SELECT @x = xCol.BulkColumn FROM OPENROWSET (BULK 'c:\Update.xml', SINGLE_BLOB) AS xCol; 
+0

問題は、列名をSPにコード化する必要があることです。私は属性名に基づいて一括挿入できる動的なソリューションを探しています。 – Daniel

+0

なぜsp?それらはXMLファイルにありませんか? – Diego

関連する問題