SQL Server2000にストアドプロシージャがあります。次のものが含まれています。select ... into ##Temp ...
...
drop table ##Temp
ADOを使用してストアドプロシージャを2回実行すると、次のプロンプトが表示されます。
データベースには「## Temp」という名前のオブジェクトがすでに存在します。
誰かが何が悪いのか教えてもらえますか?
ストアドプロシージャを書き直して、一時テーブルが存在する場合は削除する必要があります。そうすれば、この問題は発生しません。
IF (SELECT object_id('TempDB..##Temp')) IS NOT NULL
BEGIN
DROP TABLE ##Temp
END
ああ、それはすべて私のせいです。誤って1つの接続でSPを2回呼び出しました。
そのため、2回目に呼び出されたときに常にエラーが報告されます。
もちろん、私の説明を読んでもそれはわかりません。すみません...
テーブル名の先頭にある##で示されているように、グローバル一時テーブルを使用しています。これは、複数のセッションがテーブルにアクセスできることを意味します。
テーブルを作成した接続を開いているが、ドロップに失敗した可能性があります。最初のADO実行で実際にテーブルが削除されます。失敗したのでしょうか、それともプロシージャのフロー制御でdropステートメントがスキップされたのでしょうか。
SQL Server Enterprise Managerでプロシージャをテストして、エラーが報告されるかどうかを確認することをお勧めします。
グローバル一時テーブル##Temp
を使用することを選択したため、いつでもすべてのSQL接続に表示されます。明らかに、ストアドプロシージャが1つの接続に対して実行されている間に、2番目の接続が着信し、さらに別の##Temp
を作成しようとしますが、それはすでに存在します。
代わりに、接続ローカルの#Temp
テーブル(1つの#
のみ)を使用してください。
私にとって、このソリューションは機能します:
IF (SELECT object_id ='#Temp') IS NOT NULL
BEGIN
DROP TABLE #Temp
END