2017-01-10 18 views
1

私はC#アプリケーションにある値を使用して更新する必要があるSQL Serverデータベーステーブルを持っています。ファイルから、外部のAPI呼び出し、など私はそれが無関係だと思います)。SQL ServerにないDataTableの値を使用してSQLを使用してSQLを使用してデータベースを更新する

に似たSQL使用して「マス」のアップデートを行うための方法があります:私は、私がいる限り、両方のテーブルが同じSQL Serverデータベースにあるとして、上記の例を使用することができたと

UPDATE myTable1 t1 
SET custAddress = t2.address 
FROM myTable2 t2 
WHERE t1.id = t2.id 

は、この場合、myTable2はアプリケーション(C#)DataTableであり、SQL Serverテーブルではありません。

上記のようなアップデートを行う方法はありますか?

アプリケーションテーブルの各行を「ループ」して各行のSQL更新をトリガすることができますが、データテーブルに何千もの行がある場合は、(可能な限り)実行する必要はありません私は更新する必要がある各行のSQLの更新。

ご協力いただければ幸いです。私は、LINQや他のC#やSQLロジックを含むソリューションや提案に触れています。

+0

これを行うためのコードを書く必要があります。それを大規模に行う機能はありません。 – NicoRiff

+1

SQL内の一時テーブルに一括ロードしてすべての行を更新する –

答えて

2
  1. データテーブル(C#)を取り出してxmlに変換します。ヒント、データセットをデータセットに追加すると、ds.GetXml()を呼び出すことができます。 (hereを参照)

  2. xmlをsql-serverにプッシュします。

  3. xmlを#tempまたは@variableテーブルにsql-server-xml機能を使用して「シュレッド」します。

  4. #tempまたは@variableテーブルのデータを使用してCUD(作成/更新/削除)操作を実行します。

    HOW TO: Perform Bulk Updates and Inserts Using OpenXML with .NET Providers in Visual C# .NET

    しかし、あなたはここで見つける寸断、代わりに、OPENXML(SQL Server 2000の構文)を使用する」の例を使用したくない:

基本的な考え方は、ここにある

http://pratchev.blogspot.com/2007/06/shredding-xml-in-sql-server-2005.html

IMHO:これは、CUD(作成/更新/削除)の「セットベース」操作を行う素晴らしい方法です。このように、すべての索引更新は、集合ベースの操作後に行われます。RBAR(行を苦労させる行)を実行すると、各単一操作後に索引を再構築する必要があります。 :(

注:#3(b)は省略可能ですが、細断処理は必要ですが、xml-shreddingから "実際の"テーブルに直接行くことができます(#tempまたは@variableテーブルをスキップします)。通常は実世界の負荷(xmlデータの量)をテストし、大きな違いがなければ#tempまたは@variableテーブルを使用します。後でデバッグするのが簡単です。一時的にselect * #myTempTable "からデータが正しく破棄されているかどうかを確認してください。また、#temp vs @variableテーブルもテストする必要があります。ベースの-xml。

https://connect.microsoft.com/SQLServer/feedback/details/250407/insert-from-nodes-with-element-based-xml-has-poor-performance-on-sp2-with-x64

それはもはや適用されないことがあります。しかしそれは気づくべきことです。私のチームと私はelement-based-xmlを属性ベースのxml(C#で)に変更してからsql-serverに送信しなければなりませんでした。

1

これを達成する最も簡単な方法は、SqlBulkCopyをステージングテーブルに使用してアプリケーションデータの一括挿入を行うことです。これをバッチで実行する場合は、batch sizeを設定するオプションもあります。

バルク挿入後、ストアドプロシージャを実行して更新を実行します。別のオプションは、挿入後トリガを使用することですが、一括してバッチを挿入すると意味があるようです。

関連する問題