- 締切済み
テーブルコピー処理
早速質問させていただきます。 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テーブルに追加したいのですが可能でしょうか? このあたりを具体的にご教授のほどお願い致します。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
SQL書き間違い INSERT INTO テーブルB (『テーブルBの列名をカンマ区切りで列挙』) SELECT 『テーブルA列名をカンマ区切りで列挙』, GETDATE() * ←←←←←←←←←←←←←←←←←←←←←←←← これ不要です FROM テーブルA WHERE テーブルBの抽出条件
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
テーブルBの削除は、トランザクションが必要ですか? 単なるワークであれば、トランザクションをかけずに、 Truncate Table テーブルB とするのが最速だと思います。 トランザクションのタイミングはさておきとして、、、 テーブルAからテーブルBへの抽出挿入は、抽出結果を同時に挿入させることが可能です。 ↓こんな感じで INSERT INTO テーブルB (『テーブルBの列名をカンマ区切りで列挙』) SELECT 『テーブルA列名をカンマ区切りで列挙』, GETDATE() * FROM テーブルA WHERE テーブルBの抽出条件
- naganaga_001
- ベストアンサー率71% (172/242)
お世話になります。 私だったら、ストアドプロシージャ使ってやるかなぁ。 ストアドのイメージはこんな感じで 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
補足
naganaga_001さん、ご回答有難う御座います。 じつは重要な事を伝え忘れておりました。 このAテーブルとBテーブルは別々のサーバー上のデータベースに格納されているのです。 本番系のサーバー上にあるデータベースのいくつかのテーブルを夜間バッチ処理でミラーサーバーに移行したいのです。 この場合、どのように実装すべきでしょうか? すみませんが宜しくご指導下さい。
補足
1050YENさん、ご回答有難う御座います。 下の方でも書きましたが、じつは重要な事を伝え忘れておりました。 このAテーブルとBテーブルは別々のサーバー上のデータベースに格納されているのです。 本番系のサーバー上にあるデータベースのいくつかのテーブルを夜間バッチ処理でミラーサーバーに移行したいのです。 この場合、どのように実装すべきでしょうか? すみませんが宜しくご指導下さい。