• ベストアンサー

ストアドプロシージャについて

お世話になります。 SQLServseのストアドプロシージャで、あるテーブルのテストデータを100件ほど作成したいと思っています。 しかし、プロシージャを実行すると「プライマリキーが重複しています」とエラーが出ます。 テーブル内にはすでにCODE='0001'と'0101'の2件が存在します。そのため挿入開始コードは'0002'としたのですが・・・。まだ同じエラーが発生します。 テーブル名:MST_USER  CODE char(4) ←キー  KBN  char(2)  NAME varchar(40)  PASS varchar(10) 作成したプロシージャ CREATE PROCEDURE dbo.test_update_USER AS declare @count int declare @kbn int set @count = 2 set @kbn = 0 while 1 = 1 begin update MST_USER set CODE = right('0000' + ltrim(str@count)), 4), KBN = right('00' + ltrim(str(@kbn)), 2), NAME = 'test' + ltrim(str(@count)), PASS = 'test' + ltrim(str(@count)) set @count = @count + 1 if (@count > 100) break if (@kbn > 3) set @kbn = 0 else set @kbn = @kbn + 1 end GO 何か間違えているのか自分ではわからなくなっている状態です。 どなたかご指摘いただけると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

UPDATE文をWHERE句なしで使っていますが、これではうまくいきません。 INSERT文を使用するのが目的にかなっているのではないでしょうか。 今の状態での動きがどうなるかを見てみますと、ループの一回目で UPDATE MST_USER SET CODE = '0002', KBN = '00', NAME = 'test2', PASS = 'test2' というSQLを流すことになります。 元から入っている2レコードが、全てこのデータに更新されようとして、CODE 0002が2レコードになるため、エラーになります。

white_dog
質問者

お礼

そうですね・・・ 既存データを全て同じものに書き換えようとしているんですよね・・・。 ケアレスミスでした。 ご指摘ありがとうございます。

その他の回答 (1)

回答No.1

データを新規作成されるのですよね? それならば、UPDATE文ではなく、INSERT文を使用すれば良いと思います。 update MST_USER set CODE = right('0000' + ltrim(str@count)), 4), KBN = right('00' + ltrim(str(@kbn)), 2), NAME = 'test' + ltrim(str(@count)), PASS = 'test' + ltrim(str(@count))  ↓ INSERT INTO MST_USER VALUES(right('0000' + ltrim(str@count)), 4), right('00' + ltrim(str(@kbn)), 2), 'test' + ltrim(str(@count)), 'test' + ltrim(str(@count)))

white_dog
質問者

お礼

そうですよね・・・ ちょっと慌てていてケアレスミスをしていました。 ご指摘ありがとうございます。

関連するQ&A