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

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

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

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

SQL

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

Q&A

3回答

3507閲覧

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

yyy

総合スコア49

SQL Server

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

SQL

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

0グッド

0クリップ

投稿2017/09/06 06:33

編集2017/09/06 07:11

###前提・実現したいこと

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

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

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

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

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

###該当のソースコード

sql

1begin tran 2 IF @val_EDIT_FLG = '2' 3 BEGIN 4 DELETE FROM 5 [MS_UP_DTL] 6 WHERE 7 [a_CD] = @key_a_CD 8 AND [b_CD] = @key_b_CD 9 AND [c_CD] = @key_c_CD 10 AND [d_CD] = @key_d_CD 11 12 END 13 14commit tran 15 16begin tran 17 IF @val_EDIT_FLG = '1' OR @val_EDIT_FLG = '2' 18 BEGIN 19 IF @val_DEL_FLG = '0' 20 BEGIN 21 INSERT INTO [MS_UP_DTL] 22 ( 23 [a_CD] 24 , [b_CD] 25 , [c_CD] 26 27 , [d_CD] 28 , [HYOJI_JUN] 29 , [REG_PROGRAM_ID] 30 , [REG_USER_ID] 31 , [REG_DTTM] 32 , [UPD_PROGRAM_ID] 33 , [UPD_USER_ID] 34 , [UPD_DTTM] 35 , [DEL_FLG] 36 ) 37 VALUES 38 ( 39 @key_a_CD 40 , @key_b_CD 41 , @c_CD 42 , @d_CD 43 44 , @val_HYOJI_JUN 45 , @PROGRAM_ID 46 , @val_USER_ID 47 , getdate() 48 , @PROGRAM_ID 49 , @val_USER_ID 50 , getdate() 51 , @val_DEL_FLG 52 ) 53 54 END 55 56 END 57commit tran 58

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

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

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

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

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

投稿2017/09/06 08:05

編集2017/09/06 15:33
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2017/09/06 07:21

workaholist

総合スコア559

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yyy

2017/09/06 07: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が単体の処理としては動くと書きました。
workaholist

2017/09/06 08:48

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

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 06:53

King_of_Flies

総合スコア382

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yyy

2017/09/06 07:10

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

2017/09/06 07:20

ちょっとどういうテーブルかわからないので自分の指摘内容があっているのかの確信がないのですが、 a_CD,b_CD,c_Cd,d_CDがキーであるならばそれを参照しているテーブルが別にあったりしませんか。 子のテーブルに親のキーを参照しているデータがある場合削除できないはずです。 Insert時のエラーメッセージではなく、削除時のエラーメッセージを見てみてはいかがでしょう。 内部のエラーがわかれば回答もしやすいので、tyr catchで例外のエラーメッセージを確認してみてはいかがでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問