tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルSqlserverからの差分入力
記事No7864
投稿日: 2008/07/26(Sat) 11:53
投稿者Potechi
いつもお世話になっております。
早速ですが、SQLServer内のテーブルに差分のみのデータを追加したいと思っております。
SqlBulkCopyを使い重複を無視した追加方法まではたどりついたのですが、実際は既存テーブルに主キーを設定したい為SqlBulkCopyを実行するとエラーになってしまいます。
既存のテーブルのデータと追加データを比較して差分のみデータを追加するにはどうしたらよいのでしょうか?
ご指導お願いいたします。

[ツリー表示へ]
タイトルRe: Sqlserverからの差分入力
記事No7868
投稿日: 2008/07/28(Mon) 03:11
投稿者オショウ
データベース(テーブル)構造を知らない状態では誰も
コメントできません!

最低でもデータベースの構造は開示するべきでしょう。

差分と表記されていますが、キーになるフィールドで、
元デーブルと履歴テーブルの差分を取り、履歴レーブル
に無いデータを元テーブルからコピーしたいように受け
取れますが、SqlBulkCopyを使いたいと言うことは、デー
タ件数が膨大なのでしょうか?

その辺も情報としては必要です・・・

以上。

[ツリー表示へ]
タイトルRe^2: Sqlserverからの差分入力
記事No7911
投稿日: 2008/08/05(Tue) 09:49
投稿者Potechi
オショウ様回答ありがとうございました。
返信が遅くなり申し訳ありませんでした。
仰られるとおり説明や提示内容がとぼしく申し訳ありません。
やりたいことは
テーブルA構造
 コード
 コード名
 数量
からなっており同じ項目からなっているCSVファイルをテーブルに追加書き込みしたいと思っております。
その追加書き込みの条件として
 @テーブルAにすでにコードが登録されていれば数量のみCSVファイルの情報に更新
 A未登録ならば全項目追加書き込み
したいと思っております。
このご指導依頼をしてから数日間私なりに検討してみてテーブルBを新規に作成しテーブルAとテーブルBの選択クエリ及び不一致クエリを作成しその情報をテーブルAに反映させたらいいのかな?とは思ったのですがなかなか実行する実力が無く停滞しているところです。

申し訳ありませんが今一度ご指導願います。

[ツリー表示へ]
タイトルRe^3: Sqlserverからの差分入力
記事No7912
投稿日: 2008/08/05(Tue) 10:12
投稿者オショウ
> その追加書き込みの条件として
>  @テーブルAにすでにコードが登録されていれば数量のみCSVファイルの情報に更新
>  A未登録ならば全項目追加書き込み
> したいと思っております。
> このご指導依頼をしてから数日間私なりに検討してみてテーブルBを新規に作成しテーブルAとテーブルBの選択クエリ及び不一致クエリを作成しその情報をテーブルAに反映させたらいいのかな?とは思ったのですがなかなか実行する実力が無く停滞しているところです。
>
> 申し訳ありませんが今一度ご指導願います。

  やり方は、プログラマーの技量に応じていろいろあると思いますが、上記の
  方法で概ねよいのでは・・・

  1.BテーブルにCSV読み込み
  2.A・Bテーブルで、存在するデータの更新クエリ発行
  3.A・Bテーブルでの不一致クエリによるデータ追加を発行

  後は、SQL文をどう書くか・・・

  プログラム化する前に、ManagementStudioで、新規クエリで手入力したSQL
  文を実行して動作を確認し、結果、良好ならプログラム化する・・・

  とりあえず頑張って下さい!としか言いようがありません。

以上。

[ツリー表示へ]
タイトルRe^4: Sqlserverからの差分入力
記事No7913
投稿日: 2008/08/05(Tue) 13:28
投稿者Potechi
オショウ様回答ありがとうございました。
最後に今一度教えてください。
工程的にあっているかわかりませんが
 @テーブルAとテーブルBを比較しテーブルAにのみ存在するデータを取得
 Private Sub 選択クエリ()
  Cn = New SqlConnection(・・・)
    Dim SQLCm As SqlCommand = Cn.CreateCommand
    Adapter = New SqlDataAdapter(SQLCm)
    選択Table = New DataTable
    Dim sql As String
    sql = "SELECT  tbl_A.* "
    sql = sql & "FROM tbl_A LEFT OUTER JOIN tbl_B ON tbl_A.コード = tbl_B.コード "
    sql = sql & "WHERE (((tbl_B.コード) Is Null))"
    SQLCm.CommandText = sql
    Adapter.Fill(選択Table)
 END SUB

 AテーブルAとテーブルBを比較しテーブルBにのみ存在するデータを取得
 Private Sub 差分クエリ()
    Cn = New SqlConnection(・・・)
    Dim SQLCm As SqlCommand = Cn.CreateCommand
    Adapter = New SqlDataAdapter(SQLCm)
    差分Table = New DataTable
    Dim sql As String
    sql = "SELECT  tbl_B.* "
    sql = sql & "FROM tbl_B LEFT OUTER JOIN  tbl_A ON tbl_B.コード = tbl_A.コード "
    sql = sql & "WHERE (((tbl_A.コード) Is Null))"
    SQLCm.CommandText = sql
    Adapter.Fill(差分Table)
 END SUB

 B両方のテーブルに含まれている場合はテーブルBの値を取得
 Private Sub 更新クエリ()
    Cn = New SqlConnection(・・・)
    Dim SQLCm As SqlCommand = Cn.CreateCommand
    Adapter = New SqlDataAdapter(SQLCm)
    更新Table = New DataTable
    Dim sql As String
    sql = "SELECT  tbl_B.* "
    sql = sql & "FROM tbl_A INNER JOIN tbl_B ON tbl_A.コード = tbl_B.コード"
    SQLCm.CommandText = sql
    Adapter.Fill(更新Table)
 END SUB

 C上記で取得したデータを連結し表示
   Private Sub cmd_Change_Click
    選択Table.Merge(差分Table)
    選択Table.Merge(更新Table)
    Me.dgv_MasteTable.DataSource = 選択Table
  END SUB

C工程で最終的に出来た"選択Table"のデータをテーブルAに反映させればいいのかなとは思うのですがその方法がわかりません。

今のところ私の知る範囲ではがんばったつもりではいるのですがここでまたまた停滞してしまいました。

申し訳ありませんがご指導お願いいたします。

[ツリー表示へ]
タイトルRe^5: Sqlserverからの差分入力
記事No7914
投稿日: 2008/08/05(Tue) 16:42
投稿者アッシ
こんにちは。

なんか難しく考えてらっしゃるようで。

@CSVデータをテーブルBに挿入
<割愛>

AテーブルA、テーブルBともに存在するコードにテーブルBの数量を更新
UPDATE tbl_A
   SET 数量 = B.数量
  FROM tbl_A AS A
INNER JOIN tbl_B AS B
    ON A.コード = B.コード;

BテーブルBのみに存在するデータをテーブルAに挿入
INSERT INTO tbl_A
          ( コード
          , 数量
          )
     SELECT B.コード
          , B.数量
       FROM tbl_B AS B
       LEFT JOIN tbl_A AS A
         ON B.コード = A.コード
      WHERE A.コード IS NULL;

できれいさっぱり。

[ツリー表示へ]
タイトルRe^6: Sqlserverからの差分入力
記事No7916
投稿日: 2008/08/06(Wed) 09:03
投稿者Potechi
アッシ様回答ありがとうございました。
こんなに簡単に出来るとは!!
大変勉強になりました。

今後ともよろしくお願いいたします。

[ツリー表示へ]