• 締切済み

テーブルコピー処理

早速質問させていただきます。 VB2005+MSDE2000でWindowsアプリを作成しています。 Aテーブル(本番テーブル)とBテーブル(ミラーテーブル)がありまして、 BテーブルはAテーブルと同列を持っており最終列に更新時刻が追加されています。そしてAとBともに年月列(200610等)を持っています。 実現したい処理は、年月度の売上データをミラーテーブルにコピーする処理です。 1.年月を元にAテーブルからデータを抽出する。 2.Bテーブルに対してトランザクションをかける。 3.年月を元にBテーブルから削除する。 4.1で取得したデータをBテーブルに追加する。  (この時、Bテーブルの最終列に更新時刻を入れる。) このような処理を行う際に、処理1は単純にセレクトなのでSqlDataAdapterでDataTableに流し込むのが最適かなと思います。 処理2についてもSqlTransactionを開始すればOK。 処理3はトランザクション内で削除を実施。 最後の処理4をどのように実装すればよいのか不明です。 SqlDataAdapterを使って処理1で取得したDataTableをBテーブルに追加したいのですが可能でしょうか? このあたりを具体的にご教授のほどお願い致します。

みんなの回答

回答No.3

SQL書き間違い INSERT INTO テーブルB (『テーブルBの列名をカンマ区切りで列挙』) SELECT 『テーブルA列名をカンマ区切りで列挙』, GETDATE() * ←←←←←←←←←←←←←←←←←←←←←←←← これ不要です FROM テーブルA WHERE テーブルBの抽出条件

回答No.2

テーブルBの削除は、トランザクションが必要ですか? 単なるワークであれば、トランザクションをかけずに、 Truncate Table テーブルB とするのが最速だと思います。 トランザクションのタイミングはさておきとして、、、 テーブルAからテーブルBへの抽出挿入は、抽出結果を同時に挿入させることが可能です。 ↓こんな感じで INSERT INTO テーブルB (『テーブルBの列名をカンマ区切りで列挙』) SELECT 『テーブルA列名をカンマ区切りで列挙』, GETDATE() * FROM テーブルA WHERE テーブルBの抽出条件

adminchan
質問者

補足

1050YENさん、ご回答有難う御座います。 下の方でも書きましたが、じつは重要な事を伝え忘れておりました。 このAテーブルとBテーブルは別々のサーバー上のデータベースに格納されているのです。 本番系のサーバー上にあるデータベースのいくつかのテーブルを夜間バッチ処理でミラーサーバーに移行したいのです。 この場合、どのように実装すべきでしょうか? すみませんが宜しくご指導下さい。

回答No.1

お世話になります。 私だったら、ストアドプロシージャ使ってやるかなぁ。 ストアドのイメージはこんな感じで ALTER PROCEDURE AddHOGEHOGE   @ID int,   @column2_value varchar(10),   @column3_value smallint AS BEGIN   SET NOCOUNT ON;   INSERT INTO HOGEHOGE(   ID,   Column2,   Column3,   更新時刻 -- datetime 型   )VALUES(   @ID,   @column2_value,   @column3_value,   GETDATE()   )   RETURN 0 END .NET から ストアド呼ぶのはこんな感じで。 Using con As SqlClient.SqlConnection = New SqlClient.SqlConnection("接続文字列")   con.Open()   Dim tran As SqlClient.SqlTransaction = con.BeginTransaction()   Try     Dim command As SqlClient.SqlCommand = New SqlClient.SqlCommand     command.Connection = con     command.CommandType = CommandType.StoredProcedure     command.CommandText = "ストアド名"     command.Parameters.Add("@ID", System.Data.SqlDbType.Int)     command.Parameters.Add("@column2_value", System.Data.SqlDbType.VarChar, 10)     command.Parameters.Add("@column3_value", System.Data.SqlDbType.SmallInt)     For Each row As DataRow In datatableObject.Rows       command.Parameters("@ID").Value = row("ID")       command.Parameters("@column2_value").Value = row("column2")       command.Parameters("@column3_value").Value = row("column3")       Dim effectcount As Integer = command.ExecuteNonQuery()     Next     tran.Commit()   Catch ex As Exception     tran.Rollback()     Throw   Finally     If Not con Is Nothing Then con.Close()   End Try End Using TableAdapter を使って呼んでも楽だと思います。 datetime 型でなく、varchar とかなら、こんな感じにするとか。 http://www7.big.or.jp/~pinball/discus/sqls/28111.html

adminchan
質問者

補足

naganaga_001さん、ご回答有難う御座います。 じつは重要な事を伝え忘れておりました。 このAテーブルとBテーブルは別々のサーバー上のデータベースに格納されているのです。 本番系のサーバー上にあるデータベースのいくつかのテーブルを夜間バッチ処理でミラーサーバーに移行したいのです。 この場合、どのように実装すべきでしょうか? すみませんが宜しくご指導下さい。

関連するQ&A