2

レコードとそれに関連する子を同じデータベース内の新しいレコードと新しい関連する子にコピーできる関数をC#で作成しました。(これは、以前の作業を新しい作業のテンプレートとして使用できるようにするアプリケーション用です。)

とにかく、それはうまく機能します...これがコピーをどのように達成するかについての説明です:

2列のメモリベースのルックアップテーブルに、各レコードの現在の主キーを入力します。次に、新しいコピーレコードを個別に作成するときに、ルックアップテーブルを新しいレコードのID PKで更新します[SCOPE_IDENTITY()から取得]。これで、関連する子をコピーするときに、新しい親PKを検索して、新しいレコードにFKを設定できます。

テストでは、SQL Server 2005ExpressEditionのローカルインスタンスにリレーショナル構造をコピーするのに1分しかかかりませんでした。残念ながら、生産がひどく遅いことが証明されています!私のユーザーは、LANを介してSQLServerへの親レコードごとに60,000以上のレコードを処理しています。私のコピー機能は引き続き機能しますが、これらの各レコードは個別のSQL UPDATEコマンドを表し、通常の2%のアイドル状態から約17%のCPUでSQLServerをロードします。50,000レコードのコピーのテストを終えたところですが、20分近くかかりました。

SQLクエリまたは保存されたプロシージャでこの機能を複製して、各クライアントからLAN経由でブラストする代わりに、SQLサーバーにすべてのコピー作業を実行させる方法はありますか?

(Microsoft SQL Server 2005 Standard Editionを実行しています。)

ありがとう!

-デレク

4

2 に答える 2

1

はい、SQL 2005の場合は、CLRストアドプロシージャを使用してC#コードをDbにインストールできる可能性があります。純粋なTSQLを実行するには、面倒で新しいキーに変数を使用する必要があるだけです。これは、1つの親レコードと、1つの子テーブルにのみ存在する多数の子レコードの場合ですか?この場合、特にPKにID列を使用している場合は、selectステートメントを挿入に埋め込むことができるという事実を活用することで、子行ごとに個別の挿入コマンドを発行することを回避できる可能性があります。あなたがそれを行うことができれば、それは通常はるかに速くなります。このようなもの(構文は少しずれているかもしれませんが、とにかく実際のテーブルに適応させる必要があります):

insert into tblchild select @newparentId, col1,col2 from tblChild where parentid=@oldparentid

これがSQLServerのCLRの出発点です...

http://msdn.microsoft.com/en-us/library/ms131045.aspx(この記事はSQL 2008ですが、その多くはおそらく当てはまります)。

http://www.sqlteam.com/article/writing-clr-stored-procedures-in-charp-introduction-to-charp-part-1

于 2010-04-29T23:04:11.450 に答える
0

(擬似コード)を使用します

INSERT INTO (PkField, FkField, OtherFields) SELECT NewPkValue, NewFkValue, OtherFields FROM TableName WHERE FkField = OldFkValue

レコードごとの単一の更新ではなく、バッチ処理されるという点で、関連する子テーブルのヘルプですか?

于 2010-04-29T23:26:00.963 に答える