5

一時テーブルを作成し、一時テーブルへの一括挿入を実行し、テーブルを使用してSQLを実行してから、削除するクライアントアプリケーションがあります。

擬似コード:

open connection
begin transaction
CREATE TABLE #Temp ([Id] int NOT NULL)
bulk insert 500 rows into #Temp
UPDATE [OtherTable] SET [Status]=0 WHERE [Id] IN (SELECT [Id] FROM #Temp) AND [Group]=1
DELETE FROM #Temp WHERE [Id] IN (SELECT [Id] FROM [OtherTable] WHERE [Group]=1)
INSERT INTO [OtherTable] ([Group], [Id]) SELECT 1 as [Group], [DocIden] FROM #Temp

DROP TABLE #Temp
COMMIT TRANSACTION
CLOSE CONNECTION

これは、DROPステートメントのエラーで失敗しています。

テーブル'#Temp'が存在しないか、権限がないため、削除できません。

最初に何かが起こらなければ、この障害がどのように発生するかは想像できませんが、これより前に他の障害が発生することはありません。

これを引き起こす可能性のある私が見逃しているものはありますか?

4

4 に答える 4

9

その間のセッションで何かが起こっている可能性がありますか?

削除する前に、テーブルの存在を確認してください。

IF object_id('tempdb..#Temp') is not null
BEGIN
   DROP TABLE #Temp
END
于 2010-04-15T01:26:18.703 に答える
7

これを SQL Server 2005 でテストしたところ、一時テーブルを作成したトランザクションで削除できます。

begin transaction
create table #temp (id int)
drop table #temp
commit transaction

どのバージョンの SQL Server を使用していますか?

一時テーブルを削除する理由を再考するかもしれません。接続が終了すると、ローカル一時テーブルは自動的に削除されます。通常、明示的にドロップする必要はありません。

グローバル一時テーブルはダブル ハッシュ (fe ##MyTable.) で始まりますが、グローバル一時テーブルでさえ、接続が参照されない場合は自動的に削除されます。

于 2010-04-15T05:29:51.657 に答える
2

ステートメントが

CREATE TABLE #Temp ([Id] AS int)

間違っています。のように書いてください。

CREATE TABLE #Temp ([Id] int)

そして、それが機能するかどうかを確認してください。

于 2010-04-15T01:33:15.377 に答える