2010-04-15 26 views
5

Tengo una aplicación cliente que crea una tabla temporal, realiza una inserción masiva en la tabla temporal, luego ejecuta algunos SQL utilizando la tabla antes de eliminarla.DROP TABLE falla para la tabla temporal

pseudo-código:

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 

Esto está fallando con un error en la instrucción DROP:

No se puede eliminar la tabla '#Temp', ya que no existe o no tiene permiso .

No me puedo imaginar cómo podría ocurrir esta falla sin que algo más suceda primero, pero no veo ningún otro error que ocurra antes de esto.

¿Hay algo que me falta que podría estar causando esto?

+0

Una sugerencia, mover la creación, inserción masiva, y las declaraciones y colocar fuera del bloque de transacción. No hay motivo ni necesidad de bloquearlo, ya que ninguna otra conexión puede acceder a él. –

+0

@Philip Kelley: Esa no es una mala idea, veré si puedo hacer eso para limitar la duración de la transacción, pero no veo cómo podría estar causando este problema – StarBright

+0

Parece que el error se está manifestando en el espacio en blanco . ;) Un script de reproducción completo arrojaría más luz sobre esto. – Aaronaught

Respuesta

5

posiblemente algo esté sucediendo en la sesión intermedia?

trate de comprobar la existencia de la mesa antes de que se cayó:

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

Estoy agregando algunos instrumentos para tratar de determinar si la tabla realmente se ha ido, pero mientras tanto no puedo ver nada que pueda estar causando esto. No hay SQL ocurriendo en la sesión aparte de lo que he descrito y no recibo ningún error de las otras declaraciones – StarBright

2

creo que no va a crear la tabla en absoluto, porque la declaración

CREATE TABLE #Temp ([Id] AS int) 

es incorrecto. Por favor, escríbalo como

CREATE TABLE #Temp ([Id] int) 

y ver si funciona.

+0

Disculpe la confusión, estaba cambiando el nombre de la tabla para proteger a los inocentes y lo escribí mal ... la definición de la tabla real es semánticamente correcta, actualizaré la pregunta – StarBright

6

He probado esto en SQL Server 2005, y se puede eliminar una tabla temporal en la transacción que lo creó:

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

¿Qué versión de SQL Server está utilizando?

Puede que reconsidere por qué está bajando la tabla de temperatura en absoluto. Una tabla temporal local se elimina automáticamente cuando finaliza la conexión. Generalmente no hay necesidad de soltarlo explícitamente.

Una tabla temporal global comienza con un hash doble (es decir, ##MyTable). Pero incluso una tabla temporal global se elimina automáticamente cuando no se hace referencia a ninguna conexión.

+2

+1 para "por qué soltar la tabla temporal" –

2
BEGIN TRAN 

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

COMMIT TRAN 

Nota: Por favor, introduzca su nombre de la tabla donde TABLE_NAME y el nombre de base de datos donde dice DATABASE_NAME

Cuestiones relacionadas