2011-12-07 8 views
7

SQL Serverのでは動作し、ほとんどの人は、あなたがそうのような一時テーブルを宣言することができます知っているように:SQL Server 2005のインデックスに動的な名前を付けますか?

create table #foo 
    (
    row_id int identity not null primary key, 
    bar varchar(50) not null default 'YoMomma' 
    ); 

を...これは、この一時テーブルの主キーとデフォルトの制約を作成します。これらのオブジェクトの名前はSql Serverによって動的に作成され、一意になります。

テーブルを作成した後に動的に名前付きインデックスを作成することはできますか?テンポラリテーブルを使用するストアドプロシージャが同時に複数のインスタンスを実行している可能性があり、tempdbデータベース内の同じ名前のオブジェクト間で競合が発生することなくパフォーマンスを向上させたい場合があります。 CREATE INDEXコマンドには明示的なインデックス名が必要です。

私はダイナミックSQLを含まないソリューションを探しています。動的名だけです。

答えて

14

これは、非問題です。インデックス名は一意である必要はありません。制約名だけが行います。

だから、例えば、あなたは何の問題

CREATE TABLE #T 
(
C INT 
) 

CREATE UNIQUE CLUSTERED INDEX ix on #T(C) 

で複数の同時接続でこれを実行することができます。しかし、これはこれは本当に答えであるように見えるん同時実行

ALTER TABLE #T 
ADD CONSTRAINT UQ UNIQUE NONCLUSTERED (C) 
+3

うーん... SQL Serverで10年間働いていて、それは分かりませんでした。私は単純に、インデックスが制約に似たオブジェクトとして扱われていると仮定しましたが、私はそれを試して、矛盾がないことを確認しました。良い情報! –

+2

@ JeremyHolovacs - Constraintsは一意性要件の理由ですが、私が推測する 'sys.objects'に格納されたメタデータを取得します。 –

+1

+1ニース、私は@JeremyHolovacsと同じ仮定の下にいた – Yuck

1

は行うことができるようになります。

CREATE INDEX #foo1 ON #foo(bar); 
+0

の下で失敗するでしょう。ありがとう! –

+0

申し訳ありません@MartinSmithへの回答を変更しなければならなかった...彼の答えはより正確でした。 –

+0

問題なし、ちょうどあなたが解決策を見つけてうれしく思います...私はマーティンが好きです。 – Sparky

関連する問題