web-dev-qa-db-ja.com

データベースには「## Temp」という名前のオブジェクトがすでに存在します

SQL Server2000にストアドプロシージャがあります。次のものが含まれています。
select ... into ##Temp ...
...
drop table ##Temp

ADOを使用してストアドプロシージャを2回実行すると、次のプロンプトが表示されます。
データベースには「## Temp」という名前のオブジェクトがすでに存在します。
誰かが何が悪いのか教えてもらえますか?

13
phoenies

ストアドプロシージャを書き直して、一時テーブルが存在する場合は削除する必要があります。そうすれば、この問題は発生しません。

IF (SELECT object_id('TempDB..##Temp')) IS NOT NULL
BEGIN
    DROP TABLE ##Temp
END
23
Jon Freedman

ああ、それはすべて私のせいです。誤って1つの接続でSPを2回呼び出しました。
そのため、2回目に呼び出されたときに常にエラーが報告されます。
もちろん、私の説明を読んでもそれはわかりません。すみません...

1
phoenies

テーブル名の先頭にある##で示されているように、グローバル一時テーブルを使用しています。これは、複数のセッションがテーブルにアクセスできることを意味します。

テーブルを作成した接続を開いているが、ドロップに失敗した可能性があります。最初のADO実行で実際にテーブルが削除されます。失敗したのでしょうか、それともプロシージャのフロー制御でdropステートメントがスキップされたのでしょうか。

SQL Server Enterprise Managerでプロシージャをテストして、エラーが報告されるかどうかを確認することをお勧めします。

1
bobs

グローバル一時テーブル##Tempを使用することを選択したため、いつでもすべてのSQL接続に表示されます。明らかに、ストアドプロシージャが1つの接続に対して実行されている間に、2番目の接続が着信し、さらに別の##Tempを作成しようとしますが、それはすでに存在します。

代わりに、接続ローカルの#Tempテーブル(1つの#のみ)を使用してください。

1
marc_s

私にとって、このソリューションは機能します:

IF (SELECT object_id ='#Temp') IS NOT NULL
BEGIN
   DROP TABLE #Temp
END
0
Rayven Visva