質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • SQL

    2330questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • SQL Server

    573questions

    SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL ServerでDELETEを全部終わらせてからINSERTの処理をしたい

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 398

yyy

score 37

前提・実現したいこと

C#画面からSQL Serverを呼び出して以下の処理(複数もしくはいずれか)を行いたい。
①DELETE
➁INSERT
③DELETE/INSERT

テーブルキー項目の変更(ドロップダウン)ができる仕様です。
その為、キー列項目の入れ替えを行う際に③DELETE/INSERTの処理をしようとしています。

発生している問題・エラーメッセージ

キー項目の重複チェックでエラーが発生しています。
また、①DELETE・②INSERTの処理は単体で動きます。

1つのストアドに①~③までの処理を書き込んでいますが、それが良くないのでしょうか…。
(C#側からの呼び出しは1回のみです。)

該当のソースコード

begin tran
        IF @val_EDIT_FLG = '2'
        BEGIN
                DELETE FROM 
                    [MS_UP_DTL]
                WHERE 
                        [a_CD] = @key_a_CD
                AND        [b_CD]  = @key_b_CD
                AND        [c_CD] = @key_c_CD
                AND        [d_CD] = @key_d_CD

        END

commit tran

begin tran
        IF @val_EDIT_FLG = '1' OR @val_EDIT_FLG = '2'
        BEGIN
            IF @val_DEL_FLG = '0'
            BEGIN
                INSERT INTO [MS_UP_DTL]
                    (
                        [a_CD]
                    ,    [b_CD]        
                    ,    [c_CD]

                    ,    [d_CD]
                    ,    [HYOJI_JUN]
                    ,    [REG_PROGRAM_ID]
                    ,    [REG_USER_ID]
                    ,    [REG_DTTM]
                    ,    [UPD_PROGRAM_ID]
                    ,    [UPD_USER_ID]
                    ,    [UPD_DTTM]
                    ,    [DEL_FLG]
                    )
                 VALUES
                    (
                        @key_a_CD
                    ,    @key_b_CD
                    ,    @c_CD
                    ,    @d_CD

                    ,    @val_HYOJI_JUN
                    ,    @PROGRAM_ID
                    ,    @val_USER_ID
                    ,    getdate()
                    ,    @PROGRAM_ID
                    ,    @val_USER_ID
                    ,    getdate()
                    ,    @val_DEL_FLG
                    )

            END

        END
commit tran
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

キーの重複チェックでエラーが出ているのであれば、
削除処理のDELETEで上手くデータが削除できていないのでは?

たとえば以下の条件はすべてANDで指定していますが、
これはどれか一つでも=にならないデータがあるならa_CD,b_CD,c_CD,d_CDの値を持つデータは残ります。
WHERE 
[a_CD] = @key_a_CD
AND        [b_CD]  = @key_b_CD
AND        [c_CD] = @key_c_CD
AND        [d_CD] = @key_d_CD

残ったデータがキーとして存在している状態で、新規にインサートして重複に引っかかるということかなと思いましたが、どうでしょうか。
あるいはc_CDがkeyで、null許容型でないのであれば、Insertのデータにc_CDがないのが気になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/06 16:10

    INSERTにc_CDがなかったのは間違いでした。修正しました。

    takkoさんの書かれている通り、キーが残ってINSERTが重複にかかるという状態を回避するため、
    DELETEを全部終わらせてからINSERTの処理をしたいのです。
    書き方等おわかりになりますでしょうか。

    キャンセル

  • 2017/09/06 16:20

    ちょっとどういうテーブルかわからないので自分の指摘内容があっているのかの確信がないのですが、
    a_CD,b_CD,c_Cd,d_CDがキーであるならばそれを参照しているテーブルが別にあったりしませんか。

    子のテーブルに親のキーを参照しているデータがある場合削除できないはずです。
    Insert時のエラーメッセージではなく、削除時のエラーメッセージを見てみてはいかがでしょう。

    内部のエラーがわかれば回答もしやすいので、tyr catchで例外のエラーメッセージを確認してみてはいかがでしょうか。

    キャンセル

0

  • MS_UP_DTLの主キーは何ですか?
  • DLETE時は@key_c_CD、@key_d_CDを使っているのにINSERT時は@c_CD、@d_CDを使っているのはなぜですか?
  • INSERTの前にDELETEが実行されていることはどうやって確認されたのですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/06 16:31

    ・主キーはDELETEのWHERE句に入れている@key_a_CD、@key_b_CD、@key_c_CD、@key_d_CDです。

    ・省略してしまっていましたが、データが渡ってきた後に@key_c_CDをsubstringで分割して@c_CDと@d_CDにしているためです。

    ・INSERTの前にDELETEの実行を確認したとは書いておりません。
    INSERTとDELETEが単体の処理としては動くと書きました。

    キャンセル

  • 2017/09/06 17:48

    与えられた情報からだと、
    ・DELETEせずにINSERTしている
    ・DELETEしたレコードとINSERTしているレコードの主キーが異なる
    という可能性しかわかりません。

    キャンセル

0

※質問が多すぎて、回答では無いですけどこちらに。

キー項目の変更だったら、キー項目のUPDATEですよね。
それをdelete/insertでやるのであれば、変更前のキー値でdeleteして、変更後のキー値でinsertしているのでしょうか?

この場合、変更後のキー値で既に登録されているものがあれば、キー重複となります。

でも、deleteとinsert単体ではうまくいってるんですよね??
引き合いに出すという事は、関係があると思ったんですが、単にストアドに(削除・追加・更新)の処理がありますよ、ってことですか?

それから、サンプルソースの@val_EDIT_FLG の判定はなんか変ですけど、実際のコードとは違うんですよね?
deleteしてないのにinsertしてるとかのオチだったりして。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • SQL

    2330questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • SQL Server

    573questions

    SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。