比較的単純な問題です。
Table A
ID int
PK、ユニークName varchar(500)
、およびcola, colb
など
Table B
がTable A
への外部キーを持っています。TSQL大規模なリレーショナルデータの挿入、外部キー昇格
したがって、アプリケーションでは、テーブルAとテーブルBの両方のレコードをメモリ内のDataTableに生成しています。
非常に多数の「クライアント」でこれらのレコードが何千も生成されています。
最終的に私たちはこれらのレコードを保存するように呼び出します。ただし、テーブルAのレコードはすでにデータベースに存在している可能性があるため、既存のレコードの主キーを取得し、欠落したレコードを挿入する必要があります。次に、正しい外部キーを使用してテーブルBのすべてのレコードを挿入します。
提案ソリューション:
私が欠落しているレコードを挿入し、TableVarA
に行セットとしてオープンし、すでに存在するレコードの主キーでTableVarA
を更新するために、SQL ServerのXML文書を送っ検討していたと出力をTableVarNew
に設定した後、のName
とプライマリキーをTableVarA
から選択します。
次にコードで正しいFKをメモリにTableB
に入力し、SqlBulkCopy
を使用してこれらのレコードをすべて挿入します。
これは良い解決策のようですか?もしそうなら、TableB
のメモリにFKを設定し、返されたDataSetの主キーと一致させる最良の方法は何でしょうか。
これは、固有の名前で行われます。 表Aを挿入する部分は、変更することを話していますか?これは、両方のテーブルvarsをunionで選択する代わりに、TableVarAをTableVarNewの結果で更新し、それをDataSetとして返しますか? – TrevDev
また、私はあなたの答えを見た:http://stackoverflow.com/questions/3006472/fast-insert-relationalnormalized-data-tables-into-sql-server-2008-database それはかなりスマートに聞こえたが、それは思われた多くのことが起こるようなものを最適化するのではなく、データのインポートにもっと関連しています。 IE:多くのクライアントがたくさんのレコードをたくさん送るでしょうから、これらのレコードをすばやく挿入することを確実にすることは非常に重要です。 – TrevDev
@Thx:少なくとも2つ(または3つ)の異なる「TableA」変数を使用して物をマージすることを意図していたという事実が気に入らなかった。 1つのTableA変数で必要な操作をすべて実行できると思います。また、「SqlBulkCopy」を使用してステージングテーブルにすべてをプッシュしてからすべての修正を行うというアイデアは、あまりにも悪い考えではありません。 –