2010-04-15 16 views
5

Ho un'applicazione client che crea una tabella temporanea, esegue un inserimento di massa nella tabella temporanea, quindi esegue alcuni SQL utilizzando la tabella prima di eliminarla.TABELLA DROP non riesce per la tabella temporanea

pseudo-codice:

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 

Questo sta venendo a mancare con un errore sul istruzione DROP:

Impossibile eliminare la tabella '#Temp', perché non esiste o non si dispone dell'autorizzazione .

Non riesco a immaginare come si possa verificare questo errore senza che succeda qualcos'altro, ma non vedo altri errori che si verificano prima di questo.

C'è qualcosa che mi manca potrebbe causare questo?

+0

Un suggerimento, spostare il creare, inserimento di massa, ed e rilasciare dichiarazioni al di fuori del blocco di transazione. Non c'è motivo o necessità di bloccarlo, poiché nessun'altra connessione può accedervi. –

+0

@Philip Kelley: Non è una cattiva idea, vedrò se posso farlo per limitare la lunghezza della transazione, ma non riesco a vedere come ciò causerebbe questo problema – StarBright

+0

Il bug sembra manifestarsi negli spazi bianchi . ;) Un completo repro script potrebbe far luce su questo. – Aaronaught

risposta

5

forse qualcosa sta accadendo nella sessione in mezzo?

Prova a controllare l'esistenza del tavolo prima che sia caduto:

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

Sto aggiungendo alcuni strumenti per provare a determinare se la tabella è davvero sparita, ma nel frattempo non riesco a vedere nulla che possa causare questo. Non c'è SQL che si verifica nella sessione diverso da quello che ho descritto e non ricevo errori dalle altre dichiarazioni – StarBright

2

penso che non si sta creando il tavolo a tutti, perché l'istruzione

CREATE TABLE #Temp ([Id] AS int) 

non è corretto. Per favore, scrivilo come

CREATE TABLE #Temp ([Id] int) 

e vedere se funziona.

+0

Scusate per la confusione, stavo cambiando il nome della tabella per proteggere l'innocente e ho digitato male ... la definizione attuale della tabella è semanticamente corretta, aggiornerò la domanda – StarBright

6

Ho provato questo su SQL Server 2005, e si può cadere una tabella temporanea nella transazione che lo ha creato:

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

Quale versione di SQL Server stai usando?

Si potrebbe riconsiderare il motivo per cui si sta abbandonando il tavolo temporaneo. Una tabella locale temporanea viene automaticamente cancellata al termine della connessione. Di solito non c'è bisogno di rilasciarlo esplicitamente.

Una tabella temporanea globale inizia con un doppio cancelletto (ad esempio ##MyTable). Tuttavia, anche una tabella temporanea globale viene eliminata automaticamente quando nessuna connessione fa riferimento ad essa.

+2

+1 per "perché rilasciare la tabella temporanea" –

2
BEGIN TRAN 

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

COMMIT TRAN 

Nota: Inserisci il tuo nome della tabella in cui TABLE_NAME e il nome del database in cui si dice DATABASE_NAME

Problemi correlati