• 締切済み

テーブルコピー処理

早速質問させていただきます。 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

  • alter tableすると、処理が止まってしまい困っています

    表題の件で質問させて下さい。 以前までは特に問題なく、alter tableなどで列を追加出来ていたのですが、ここ最近、データ量が増えてきたためか、列追加にすごく時間がかかってしまっています。 それが原因なのかはわからないのですが、alter tableで列を追加すると、処理が止まってしまい、プロセスをkillして、とりあえず対処する・・・ と言うような対応が続いています。 調べたところ、alter table はテーブルロックがかかってしまうらしいのですが、これは begin でトランザクションを開始させても特に意味はないのでしょうか? いろいろと調べてはいるのですが、基本的な事は見つかるのですが、運用する時にどういった注意点があるか等が今いち、調べ切れませんでしたので、どんな運用をしていけばいいのかご教授して頂けると助かります。 宜しくお願いいたします。

  • 同一トランザクションの中でテーブルの更新結果を参照できるか?

    VB5.0+SQL-Serverで、以下のような処理を 検討しているのですが、いい方法がみつかりません。 つまり、同一トランザクションの中で更新結果を 参照することが出来るのでしょうか? ご教授いただけると幸いです。 【検討中の処理】 トランザクション開始(BegenTrans)  テーブルA更新  テーブルAの更新結果を参照してテーブルBを更新 (この時点ではトランザクションを終了していないので、  テーブルAの更新結果が参照できない) トランザクション終了(CommitTrans)

  • 排他処理について

    VBでトランザクションをかけてあるテーブルを処理しています。 具体的にはテーブルAのレコードを一時的に別テーブル(テーブルB)に コピーしてそのレコードすべてを元のテーブルから削除して、 テーブルB内で処理をさせてから、そのデータをテーブルAに戻して コミットしています。 この処理中に、別PGもしくはSQLPlusでテーブルAからテーブルBに コピー対象の1レコードを削除してコミットしました。 これってエラーになる?ならない?それともトランザクション中だから テーブルAがコミットされて開放されるまで待ちの状態になる?? 実際どうなったかというとエラーにならなくて、その処理で最後に テーブルAにテーブルBをコピーしたときにエラーになって データがきえるという現象がおきてしまいました。 上記のような処理のときにOracle条ではどのような処理になるのでしょうか? よろしくお願いします。

  • トランザクション処理について

    質問させて下さい。 以下の処理を行なっております。 1. トランザクション処理開始 2. テーブルAからデータをDELETE 3. テーブルBへデータをINSERT 4. トランザクション処理終了 上記処理の場合の「TYPE=InnoDB」指定の仕方が不安です。 現在はロールバックの可能性のあるテーブルAのみ「TYPE=InnoDB」を指定しています。 その状態でコミットもうまくいっているのですが、テーブルBに「TYPE=InnoDB」を 指定しなくてもよいものなのでしょうか。 環境 MySql 4.0.24

    • ベストアンサー
    • MySQL
  • エクセルVBA、数式の入ったセルのコピーについて質問です。よろしくお願

    エクセルVBA、数式の入ったセルのコピーについて質問です。よろしくお願いします。 シートのA列は日付の入ったセルがあり、データを更新する度に行が追加されていきます。 数式(1)~(3)は、それぞれ異なる計算式が入っており、日付データを参照して計算を行っています。   A    B    C    D 1 日付データ 数式(1) 数式(2) 数式(3) 2 日付データ 数式(1) 数式(2) 数式(3) 3 日付データ   4 日付データ   5 日付データ   A列にデータが追加したときに、B~D列の数式をA列の最終行までコピーしたいのですが、 どのようなコードを書けばよいでしょうか? ちなみに、1行目のB~D列には、データ更新の有無に関わらず、必ず数式が入っているものとします。 何かよいアドバイスがあればよろしくお願いします。 【補足】 単純に考えると、B1~D1をA列の最終行までAUTOFILLすれば良いのでしょうが、データ数がかなり多く、 この方法だと時間がかかってしまいます。A列のデータ追加前の数式セルの最終行から、追加後の最終行までとすると、処理は早くなるのでしょうか?

  • タイムスタンプを使用した同期処理

    データベース(DB2 UDB V4)を使ったプログラム(下記アプリA)を作成しています。 タイムスタンプ(下記カラムJ)のみを使用して同期処理を行いたいのですが、気になることがあります。 (作成した処理内容) (1) アプリAでは、テーブルTのカラムIが1のレコードを全て取得し、テーブルTのカラムJを更新して処理Pを行う。 (2) (1)の処理P終了後引き続きアプリAにて、テーブルTのカラムIが1であり、かつカラムJが(1)で更新した時間と同じレコードのみを取得し、処理Qを行う。 (前提内容) (3) (1)の処理が行われる前と、(1)と(2)の処理が行われている間には、別アプリBから別接続で、同一のテーブルTに対してデータの追加・更新が行われており、アプリBからテーブルTに対してカラムIが1のレコードが挿入されることがある。 またアプリBからのデータの追加・更新時にも常にカラムJの更新は行われる。 以上の場合に、 (実現したい内容) アプリAでは、処理Pと処理Qでは、常に同一のデータに対して処理行いたい。 カラムJ以外に、同期処理のためのカラムは追加したくない。 (質問) 上記(1)と(3)で同一時刻にデータの更新または追加が行われた場合、タイムスタンプ(1マイクロ秒単位で記録)が全く同一になる「可能性」はあるのでしょうか?DB接続は別です。 そして、(1)では処理対象にならなかったデータが(2)では処理対象になる可能性はあるのでしょうか?例えば(1)でデータKのカラムJを更新したとき、同時に(3)でデータLのカラムJを更新しており、(1)ではデータKに対する処理のみが行われたが、(2)ではデータKに加え、(3)で更新したデータLも処理の対象となる場合です。もしあると同期処理に問題がありますよね。 微妙なところですが、悩んでいます。質問の意味がわからなかったら聞いてください。 よろしくお願いします。

  • vb.net トランザクション処理について

    VB2005、SQLServer2005環境です。 VB.Netのトランザクション処理でエラーが発生します。 エラー内容の意味すらわかりません。 どなたかご教授お願いします。 *エラー内容 "System.InvalidOperationException: ExecuteReader は、コマンドに割り当てられた接続が保留状態である ローカルのトランザクションにあるとき、トランザクション オブジェクトを持つコマンドが必要です。 コマンドの Transaction プロパティがまだ初期化されていません。 Private Sub BTN_更新_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_更新.Click Dim strsql As String Dim Tran As SqlClient.SqlTransaction = Nothing '---DB接続 Call DBConnect() Try '---SQL文作成 strsql = "SELECT * FROM Aテーブル" '---SQL文を作成して実行する Dim comm As SqlCommand = New SqlCommand(strsql, Con) '---データアダプタの作成 Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm) '---データセットへの読み込み Dim ds As DataSet = New DataSet() dataadapter.Fill(ds, "Aテーブル") Dim dt As New DataTable dt = ds.Tables("Aテーブル") '---主キーの設定 dt.PrimaryKey = New DataColumn() {dt.Columns("Aテーブル")} '---データの更新 Dim targetRow As DataRow targetRow = dt.NewRow() targetRow = dt.Rows.Find(TXT_コード.Text) targetRow("コード") = TXT_コード.Text targetRow("氏名") = TXT_氏名.Text '---コマンド自動作成 Dim cb As SqlCommandBuilder = New SqlCommandBuilder(dataadapter) '---トランザクション開始 Tran = Con.BeginTransaction() '---データベースの更新 dataadapter.Update(ds, "社員テーブル")     <<<エラーになります。 '---トランザクション完了 Tran.Commit() Catch oExcept As Exception '---ロールバック Tran.Rollback() '例外が発生した時の処理 MessageBox.Show(oExcept.ToString, "例外発生") Finally '---DB切断 Call Disconnect() End Try

  • テーブルの中身を違うテーブルへコピー

    お世話になります。 SQLについて質問があるのですが・・・。 Aというテーブルがあり、何件かデータが入っています。 そのAテーブルにフィールドを2つ新たに追加したいのです。 ALTER TABLEは使わずに、 以下の様な操作をしたいと考えております。 1:Aテーブルを違う名前に変更。  もしくはテーブルを丸々コピー。 2:テーブルBを作成。   (テーブルAのフィールドに2つフィールド追加した内容) 3:テーブルBにテーブルAの内容を丸々コピー。   その際、新規に追加した2つのフィールドには、初期値として、何かの文字or数字を入れる。 4:Aテーブルを削除 と、いう感じです。 作成はINSERT、削除はDROPを使えばいいのかなーって 思っているのですが、 テーブル名の変更や、テーブルの内容のコピーが ちょっと分かりません。 上記について、ご教授の程、よろしくお願いします。 なお、DBにはSQL Serverを使用しています。

  • トランザクションとテーブルロック

    初心者の質問で申し訳ありません。 トランザクションで複数のテーブルを更新する時、テーブルロックはかかっているのでしょうか。 具体的に言うと、 BEGIN TRAN a  INSERT INTO A VALUES('data1')  INSERT INTO B VALUES('data1','data2')  INSERT INTO C VALUES('data1','data2','data3') COMMIT TRAN a とするとき、テーブルA,B,Cはあらかじめロックしておく必要があるのでしょうか。 アドバイスお願いいたします。

  • EXCEL VBA テーブル間のコピー

    お世話になります。 VBA初心者です。 Excelで、元データであるSheet1にあるテーブルのB列をSheet2にあるテーブルのA列に転記したいと思います。このとき、Sheet2のテーブルにはデータが入っており、そのデータと重複するものを除外したものだけをSheet2テーブルの続きから入力させるにはどうしたらよいでしょうか? なにとぞご教授のほど、お願いいたします。