0

SqlCommand変数を使用して読み取るテーブルがありExecuteReader、返されたSqlDataReaderオブジェクトで実行し、各行を取得するために対話しています。そこから、SqlCommand変数を使用して新しいDBへの挿入を実行するために文字列を操作し、実行しますExecuteNonQuery().

私の質問は、これを行うためのよりエレガントで効率的な方法があるかどうかです。1 つのコマンドですべての行を取得して一度に挿入するなど、現在のフローよりも優れたものです。

UPDATE 重要なことの 1 つは、テーブルが異なるサーバー上の異なるデータベースにあることです。

4

4 に答える 4

2

私はお勧めします: 1 つのステップで試してみてください。

INSERT INTO yourDataBase1.yourTable1 VALUES (Column1, Column2, ...)
SELECT Column1, Column2, ... FROM yourDataBase2.yourTable1

利点:

  • イーサネット経由のトラフィックが少ない
  • 他のソリューション (ストアド プロシージャなど) に比べて高速

これは、C# アプリケーション (送信/ロールバック) でトランザクション ベースで行います。したがって、何か問題が発生した場合、行の半分だけが挿入されるわけではありません。

于 2013-07-15T20:56:15.610 に答える
1

SqlCommandストアドプロシージャまたは次のようなものを書くことができます

INSERT INTO DB1.dbo.TestTable(FirstName, LastName)
SELECT RemoteTable.FirstName, RemoteTable.LastName FROM
OPENROWSET('SQLOLEDB',
           'Server=x.x.x.x;Trusted_Connection=yes;user_id=xxxx;password=xxxx',
           'SELECT FirstName, LastName FROM DB2.dbo.TestTable' ) as RemoteTable
于 2013-07-15T20:39:53.393 に答える
0

操作が C# .NET を必要とするものである場合、2 つのオプションがあります。

1) 次の構文を使用して複数の行を作成して挿入します:
values (), ()
1 つのステートメントで複数の行を挿入できます。これにより
、挿入ごとに合計値を 1000 未満に保つことが最善の方法です。

2) TVP (テーブル値パラメーター) を使用する

TSQLで操作を実行してから挿入することができます。
または、CLR を使用して、挿入で C# を使用できるようにします。

Linked Server を介して、サーバーをトラバースできます。
挿入/選択で4つの部分の名前を使用するだけです。

于 2013-07-15T20:43:17.883 に答える
0

2つの回答を組み合わせて投稿します。異なるサーバーとデータベースを使用したいので、ジェイ・パテルがこれを行う最良の方法です。

しかし、それを try catch でラップすると、トランザクションが最善のアイデアになるため、Jay Patel のメソッドを使用してラップし、何らかの理由で失敗した場合にフェイルオーバーが発生するようにします。

BEGIN TRAN -- START THE TRANSACTION BUT DONT PHSICALLY PUT THE ROWS IN THE DATABASE UNTIL COMMIT
BEGIN TRY
      INSERT INTO DB1.dbo.TestTable(FirstName, LastName)
    SELECT RemoteTable.FirstName, RemoteTable.LastName FROM
    OPENROWSET('SQLOLEDB',
               'Server=x.x.x.x;Trusted_Connection=yes;user_id=xxxx;password=xxxx',
               'SELECT FirstName, LastName FROM DB2.dbo.TestTable' ) as RemoteTable
END TRY
BEGIN CATCH
ROLLBACK -- IF THE INSERT FAILS DONT INSERT ANYROWS INTO THE DATABASE
END CATCH

COMMIT --USED FOR COMMITING THE ROWS TO THE DATABASE THEY ARE NOT ACTUALLY IN THE DATABASE UNTIL THIS HAS BEEN COMMITED
于 2013-07-16T11:55:56.843 に答える