※ ChatGPTを利用し、要約された質問です(原文:Select ~ into ~ で作成した一時テーブルにプライマリキー設定)
プライマリキーの設定方法と制約名の指定について
このQ&Aのポイント
SQLServer2005を使用して、一時テーブルにプライマリキーを設定する方法を説明します。
プライマリキーを作成する際に制約名を省略する方法はありませんが、システム内で一意な名称を命名してくれることはありません。
ストアドプロシージャを並行して実行する場合は、注意が必要です。
Select ~ into ~ で作成した一時テーブルにプライマリキー設定
SQLServer2005 を使用し、ストアドプロシージャを作成しています。
select ~ into ~ で一時テーブルを作成、データ挿入するのですが、
この命令で作成された一時テーブルにプライマリキーを作成したいと
考えております。
目的は、挿入される件数が多くなりそうなので、
検索を速くする為です。
プライマリキーを作成するのは、
ALTER TABLE ~ CONSTRAINT PK_xxx PRIMARY KEY CLUSTERED ( ~ )
で作成できる事は、理解しております。
これらの処理をストアドプロシージャで行いたいのですが、
注意点としては、当ストアドプロシージャが
並行して実行される事を考慮しておかなくてはなりません。
以下のようなサンプルを作成し、テストしてみたのですが、
セション1でストアドプロシージャ実行後、
セション2でストアドプロシージャを実行してみたのですが、
以下のエラーメッセージが表示されてしまいます。
ここで質問ですが、
制約名をどのようにすれば実現できるのでしょうか。
たとえば、制約名を省略すれば、システム内で一意な名称を
命名してくれるような書き方はないのでしょうか。
ご存じの方、ご回答宜しくお願いします。
-- サンプルストアドプロシージャ
create procedure proc_test as
select getdate() AS sysdate into #worktable
alter table #worktable with nocheck add
constraint pk_xxx primary key clustered ([sysdate])
waitfor time '23:59' -- テストの為待機
-- セション1ストアドプロシージャ実行
exec proc_test
-- セション2ストアドプロシージャ実行
exec proc_test
-- セション2の実行結果
(1 行処理されました)
メッセージ 2714、レベル 16、状態 4、プロシージャ proc_test、行 6
データベースに 'pk_xxx' という名前のオブジェクトが既に存在します。
メッセージ 1750、レベル 16、状態 0、プロシージャ proc_test、行 6
制約を作成できませんでした。以前のエラーを調べてください。
お礼
早速の回答、どうもありがとうございます。 先ほど、教えて頂いた内容でテストしてみたところ、 問題なく動作しました。 これで、解決しそうです。 どうもありがとうございました。