2017-04-10 20 views
0

デフォルト名で主キーがすでに存在しています:一時テーブルは:私は、<strong>はカーソル</strong>内のストアドプロシージャに次のコードを実行している

IF (OBJECT_ID('tempdb..#newSales','U') IS NOT NULL) 
    DROP TABLE #newSales 

CREATE TABLE #newSales 
(
    AddressId INT NOT NULL, 
    ItemId INT NOT NULL, 
    [Date] DATE NOT NULL, 
    Sale REAL NULL 
) 

/* some code here */ 

ALTER TABLE #newSales 
    ADD PRIMARY KEY CLUSTERED ([AddressId] ASC, [ItemId] ASC, [Date] ASC) 
定期

私は(名前は毎回異なる次のようなエラーになってしまいます):

データベースには、すでに 'PK __#newSale__34CE1EAA297D3472'という名前のオブジェクトがあります。

私は同様の質問をチェックしましたが、ほとんどは明示的に名前付きの制約があります。この場合、PKの名前は自動的に生成され、理論的には(このプロシージャを呼び出す複数の接続であっても)一意でなければならないので、これがどうなるか理解できません。

は、どのようなエラーの原因になることができますか?

+2

おそらく2つのスレッドがコードを同時に実行しています。カーソルの中にテーブルを作成するのはいい考えのようではありません。 –

+0

私は2つのスレッドがコードを実行している場合、同時に2つの同一の一時テーブルが存在することを理解しますが、自動生成された名前はこれで助けなければならない、そうではありませんか?生成された名前が同じである理由私はカーソルのテーブルについて... を知らない:なぜそれが悪い考えですか?どこで読むことができますか? – STiLeTT

答えて

0

あなたは、並行性が問題になり、代わりに変数テーブルを使用してみてください一時テーブルを作成しないでください。以下を試してください:

DELCARE @newSales TABLE 
(
    AddressId INT NOT NULL, 
    ItemId INT NOT NULL, 
    [Date] DATE NOT NULL, 
    Sale REAL NULL, 
    PRIMARY KEY CLUSTERED ([AddressId] ASC, [ItemId] ASC, [Date] ASC) 
) 

INSERT INTO @newSales 
SELECT * 
FROM myOtherTables 
... 
+0

私のコードが同時に実行されているのかどうかはまだ分かりませんが、もしそれがあっても、なぜこれを避けるべきなのか理解できません。情報をありがとう、私は問題の原因を見つけることができない場合、私はこれを試してみます。私は、統計の欠如のために私のケースでは非常に遅いので、テーブル変数を使用したくないだけです。 – STiLeTT

+0

問題は、コードが同時に実行される場合、2番目のコードは、最初のスレッドで作成されたテーブルを削除しようとします。変数テーブルを使用すると、すべての形式の干渉が防止されます。 – LunarSage

+0

いいえ、データベースエンジンが各ローカル一時テーブル名に数値の接尾辞を追加しているため、2番目のコードは最初のテーブルを削除しません。 ([MSDN](https://technet.microsoft.com/en-us/library/ms174979(V = SQL.105).aspxの#Anchor_2)) – STiLeTT

関連する問題

 関連する問題