2010-04-15 9 views
5

J'ai une application client qui crée une table temporaire, effectue une insertion en bloc dans la table temporaire, puis exécute du code SQL à l'aide de la table avant de la supprimer.DROP TABLE échoue pour la table temporaire

Pseudo-code:

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 

Ce échoue avec une erreur sur l'instruction DROP:

Impossible de supprimer la table '#Temp', parce qu'il n'existe pas ou vous n'êtes pas autorisé .

Je ne peux pas imaginer comment cet échec pourrait se produire sans autre chose, mais je ne vois pas d'autres défaillances se produisant avant.

Y a-t-il quelque chose qui me manque et qui pourrait causer cela?

+0

Une suggestion, déplacez la création, insertion en vrac, et déposer des déclarations en dehors du bloc de transaction. Il n'y a aucune raison de le verrouiller, car aucune autre connexion ne peut y accéder. –

+0

@Philip Kelley: Ce n'est pas une mauvaise idée, je vais voir si je peux le faire pour limiter la durée de la transaction, mais je ne vois pas comment cela causerait ce problème – StarBright

+0

Le bug semble se manifester dans les espaces . ;) Un script complet de repro apporterait plus de lumière à ce sujet. – Aaronaught

Répondre

5

peut-être quelque chose se passe-t-il dans la session entre?

Essayez de vérifier l'existence de la table avant qu'il ne soit abandonné:

IF object_id('tempdb..#Temp') is not null 
BEGIN 
    DROP TABLE #Temp 
END 
+0

J'ajoute de l'instrumentation pour essayer de déterminer si la table a vraiment disparu, mais en attendant, je ne vois rien qui puisse en être la cause. – StarBright

2

Je pense que vous n'êtes pas en train de créer la table du tout, parce que la déclaration

CREATE TABLE #Temp ([Id] AS int) 

est incorrect. S'il vous plaît, écrivez-le comme

CREATE TABLE #Temp ([Id] int) 

et voir si cela fonctionne.

+0

Désolé pour la confusion, je changeais le nom de la table pour protéger l'innocent et je l'ai mal tapé ... la définition réelle de la table est sémantiquement correcte, je vais mettre à jour la question – StarBright

6

Je l'ai testé cela sur SQL Server 2005, et vous pouvez déposer une table temporaire dans la transaction qui l'a créé:

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

Quelle version de SQL Server utilisez-vous?

Vous pourriez reconsidérer la raison pour laquelle vous supprimez la table temporaire. Une table temporaire locale est automatiquement supprimée à la fin de la connexion. Il n'y a généralement pas besoin de le laisser tomber explicitement.

Une table temporaire globale commence par un double hachage (par exemple ##MyTable.) Mais même une table temporaire globale est automatiquement supprimée lorsqu'aucune connexion ne s'y réfère.

+2

+1 pour "pourquoi abandonner la table temporaire" –

2
BEGIN TRAN 

IF object_id('DATABASE_NAME..#TABLE_NAME') is not null 
BEGIN 
    DROP TABLE #TABLE_NAME 
END 

COMMIT TRAN 

Note: S'il vous plaît entrer votre nom de table où TABLE_NAME et le nom de la base de données où il est dit DATABASE_NAME

Questions connexes