¿Cómo elimino las variables de la tabla en SQL-Server? ¿Debería siquiera hacer esto?

123

Tengo una variable de tabla en un script (no un procedimiento almacenado). Dos preguntas:

  1. ¿Cómo elimino la variable de la tabla? Drop Table @varName da un error "Snytax incorrecto".
  2. ¿Debería hacer siempre esto? Escuché que es una buena práctica. ¿Es realmente necesario alguna vez para guiones pequeños como este?

Aquí está mi código:

Declare @projectList table(
    name varchar(40) NOT NULL);

Insert Into @projectList
Values ('BCR-00021')

Select *
From @projectList

Drop Table @projectList -- does not work
jtpereyda
fuente
No puede eliminarlos usted mismo, por lo que la segunda parte de su pregunta no se aplica.
Martin Smith

Respuestas:

189

Las variables de tabla son automáticamente locales y se eliminan automáticamente, no tiene que preocuparse por eso.

Hogan
fuente
17
+1: tampoco puede eliminarlos incluso si quisiera; persisten mientras la sesión esté abierta, al igual que cualquier otra variable. Tampoco se ven afectados por las transacciones.
JNK
10
El punto de @JNK sobre que no se ven afectados por las transacciones es importante, puede usar variables de tabla para almacenar datos y escribir en una tabla de registro después de que un error provoque una reversión.
HLGEM
3
No, no es lo mismo. Las mesas temporales participan en las transacciones.
Paul Perigny
Tampoco son iguales a los CTE.
Hogan
no puede eliminarlos, pero puede eliminarlos 'eliminar @projectList';)
RK Sharma
29

Las variables de tabla son como variables int o varchar.

No es necesario que las suelte. Tienen las mismas reglas de alcance que las variables int o varchar

El alcance de una variable es el rango de instrucciones Transact-SQL que pueden hacer referencia a la variable. El alcance de una variable dura desde el momento en que se declara hasta el final del lote o procedimiento almacenado en el que se declara.

gbn
fuente
1
¿Sabe si los objetos tempdb creados por las variables de la tabla se limpian cuando salen del alcance? ¿O el servidor espera hasta que se cierra la sesión antes de limpiarlos?
StriplingWarrior
21

si alguien más se encuentra con esto ... y realmente necesita soltarlo como en un bucle, puede eliminar todo de la variable de la tabla:

DELETE FROM @tableVariableName
Leo Much
fuente
7

Pero todos olvidaron mencionar que si se usa una tabla de variables dentro de un bucle, será necesario vaciarla (eliminar @table) antes de volver a cargar con datos dentro de un bucle.

Peppe
fuente
3

Al igual que TempTables, también se crea una variable de tabla local en TempDB. El alcance de la variable de tabla es el lote, el procedimiento almacenado y el bloque de instrucciones en el que se declara. Se pueden pasar como parámetros entre procedimientos. Se eliminan automáticamente cuando cierra la sesión en la que los creó.

Gagan
fuente
#temp table no es lo mismo que la variable @table, no se elimina automáticamente después del final del parche o el alcance, se elimina automáticamente solo si se creó dentro del procedimiento almacenado y el procedimiento almacenado terminó de ejecutarse
Abou-Emish
1

Aquí hay una solución

Declare @tablename varchar(20)
DECLARE @SQL NVARCHAR(MAX)

SET @tablename = '_RJ_TEMPOV4'
SET @SQL = 'DROP TABLE dbo.' + QUOTENAME(@tablename) + '';

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@tablename) AND type in (N'U'))
    EXEC sp_executesql @SQL;

Funciona bien en SQL Server 2014 Christophe

CSonneck
fuente