- ベストアンサー
ストアドプロシージャについて
お世話になります。 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 何か間違えているのか自分ではわからなくなっている状態です。 どなたかご指摘いただけると幸いです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
UPDATE文をWHERE句なしで使っていますが、これではうまくいきません。 INSERT文を使用するのが目的にかなっているのではないでしょうか。 今の状態での動きがどうなるかを見てみますと、ループの一回目で UPDATE MST_USER SET CODE = '0002', KBN = '00', NAME = 'test2', PASS = 'test2' というSQLを流すことになります。 元から入っている2レコードが、全てこのデータに更新されようとして、CODE 0002が2レコードになるため、エラーになります。
その他の回答 (1)
- rotesKomet
- ベストアンサー率31% (83/265)
データを新規作成されるのですよね? それならば、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)))
お礼
そうですよね・・・ ちょっと慌てていてケアレスミスをしていました。 ご指摘ありがとうございます。
お礼
そうですね・・・ 既存データを全て同じものに書き換えようとしているんですよね・・・。 ケアレスミスでした。 ご指摘ありがとうございます。