重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

お世話になります。
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

何か間違えているのか自分ではわからなくなっている状態です。
どなたかご指摘いただけると幸いです。

A 回答 (2件)

UPDATE文をWHERE句なしで使っていますが、これではうまくいきません。


INSERT文を使用するのが目的にかなっているのではないでしょうか。

今の状態での動きがどうなるかを見てみますと、ループの一回目で

UPDATE MST_USER
SET CODE = '0002',
KBN = '00',
NAME = 'test2',
PASS = 'test2'

というSQLを流すことになります。
元から入っている2レコードが、全てこのデータに更新されようとして、CODE 0002が2レコードになるため、エラーになります。
    • good
    • 0
この回答へのお礼

そうですね・・・
既存データを全て同じものに書き換えようとしているんですよね・・・。

ケアレスミスでした。
ご指摘ありがとうございます。

お礼日時:2004/07/27 14:13

データを新規作成されるのですよね?



それならば、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)))
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/07/27 14:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す