</table> <table name="tableName2"> </table> ... <tables> 基本的に、テーブルノードには FOR xml RAW"> </table> <table name="tableName2"> </table> ... <tables> 基本的に、テーブルノードには FOR xml RAW"> </table> <table name="tableName2"> </table> ... <tables> 基本的に、テーブルノードには FOR xml RAW" />

XML RAWデータからSQL Server 2008 R2への一括挿入

私は次のようなXML構造を持っています:

<tables>
  <table name="tableName1">
    
    
  </table>
  <table name="tableName2">
    
    
    
  </table>
  ...
<tables>

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

Now I wish to do the reverse: read the xml and insert data into respective tables of a SQL Server 2008 R2 database. However I want the loading process to be robust, meaning I do not want to mess with column names and table names if they change in the future. I need the process to read table names from @name attributes of table nodes and insert data into columns specified by attributes in nodes. I thought of a stored procedure that gets an xml as input and does the rest.

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

XML内のテーブルの順序が構築されているので、FK制約が他のテーブルを読み込んで保持できるため、プロセスは外部キーを処理してはいけません。

しかし、各テーブルにID列があるので、

SET Identity_Insert ON and SET Identity_Insert OFF

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

どちらの方法で私が行くことをお勧めしますか:私はT-SQLにとどまるべきですか、CLをSQLで記述しようとしますか? XQueryを使用するか、一部の一括挿入メソッドを使用できますか?

すべての助けをありがとう!

1

2 答え

基本的には、XMLをループして、結果セットに基づいてクエリを記述する必要があります。

これを試してみてください:

declare @i int;
declare @x xml;

------
SELECT @x = N'
<tables>
  <table name="tableName1">
    
    
  </table>
  <table name="tableName2">
    
    
    
  </table>
';


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

データを挿入するために必要な列のリストが表示されます(1つ前のレベルでテーブル名を取得できます)

34  data    dom
35  data2   dom2
1   data    dom
3   data2   dom2
7   data4   NULL

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

参考までに、XMLを書く必要はありません。このようなファイルから読むことができます:

SELECT @x = xCol.BulkColumn FROM OPENROWSET (BULK 'c:\Update.xml', SINGLE_BLOB) AS xCol;
2
追加された
問題は、列名をSPにコード化する必要があることです。私は属性名に基づいて一括挿入できる動的なソリューションを探しています。
追加された 著者 Daniel,
なぜSPに入るの?それらはXMLファイルにありませんか?
追加された 著者 Diego,

非常に大きなXML文書を扱っているので、この時点で.netシュレッダーを使用することをお勧めします。これは、CLRプロシージャまたは外部ツールで実行できます。 SQL Serverのxqueryでビルドを使用することもできますが、それは遅くなります。

しかし、これと以前の質問( MS SQL Server 2008 R2から単一のXMLファイルにデータをダンプする)、私はあなたがBCPユーティリティやレプリケーションのようなものを使う方が良いかもしれないと思っています。あなたの正確な要件は何ですか?

SQLBulkCopyクラスは私が必要としたものでした。データを高速に処理でき、適切なオプションで安全です。アイデアをありがとう。
追加された 著者 Daniel,