Los elementos temporales son estructuras de almacenamiento que existen durante la sesión de la base de datos o dentro del ámbito de un procedimiento almacenado.
Pero a veces, cuando procesas lógica compleja, necesitas un lugar donde “aparcar” datos momentáneamente. Puede ser una lista de IDs que vamos a procesar, o un resultado intermedio de un cálculo pesado.
Para esto, SQL Server nos ofrece dos mecanismos principales: las Tablas temporales y las Variables de tipo tabla.
¿Cuál elegir?
| Característica | Tabla Temporal (#Tabla) | Variable de Tabla (@Tabla) |
|---|---|---|
| Sintaxis | CREATE TABLE #Nombre | DECLARE @Nombre TABLE |
| Almacenamiento | Disco (TempDB) | Memoria / TempDB |
| Estadísticas | SÍ (Optimizable) | NO (Estimación fija = 1) |
| Índices | Completos (Clustered, Non-Clustered) | Solo PK/Unique (inline) |
| Alcance | Sesión + Procedimientos Hijos | Solo el bloque de código actual |
| Transacciones | Se deshacen con ROLLBACK | Persisten tras ROLLBACK |
| Uso Ideal | Grandes volúmenes (>100 filas) | Pequeños volúmenes, Arrays, IDs |
Tablas temporales
Son tablas reales que se crean físicamente en la base de datos del sistema tempdb. La única diferencia con una tabla normal es que su nombre empieza por una almohadilla # y se autodestruyen al cerrar la sesión.
- Alcance (Scope): Son visibles en la sesión actual y también en los procedimientos hijos. Si creas una
#Tablay llamas a un Stored Procedure, ese procedimiento puede leer tu tabla. - Rendimiento: Tienen Estadísticas e Índices completos. El motor puede optimizar las consultas sobre ellas igual que si fueran tablas normales.
- Transacciones: Participan en las transacciones. Si haces un
ROLLBACK, los datos insertados en la#Tablase deshacen.
Creación y uso de tablas temporales
Para crear una tabla temporal local, utilizamos la sintaxis estándar de CREATE TABLE, pero con el prefijo #. Aquí tienes un ejemplo:
CREATE TABLE #MiTablaTemporal (
ID INT PRIMARY KEY,
Nombre NVARCHAR(50),
FechaCreacion DATETIME
);
Una vez creada, puedes insertar datos en la tabla temporal como lo harías con una tabla normal:
INSERT INTO #MiTablaTemporal (ID, Nombre, FechaCreacion)
VALUES (1, 'Ejemplo', GETDATE());
Y luego puedes consultar los datos:
SELECT * FROM #MiTablaTemporal;
Eliminación de tablas temporales
Las tablas temporales locales se eliminan automáticamente cuando la sesión que las creó se cierra. Sin embargo, es una buena práctica eliminarlas manualmente cuando ya no son necesarias:
DROP TABLE #MiTablaTemporal;
Existe una variante con dos almohadillas ##TablaGlobal. Estas son visibles por todos los usuarios del servidor.
Evita usarlas, o usalas con extrema precaución, es fácil causar conflictos de nombres.
Variables de tipo tabla
Son estructuras que viven principalmente en la memoria (aunque pueden volcarse a tempdb si crecen mucho). Se comportan como cualquier otra variable local (@Numero, @Texto).
- Alcance (Scope): Son visibles solo en el lote (batch) actual. Si llamas a otro procedimiento, ese procedimiento no puede ver tu variable. Mueren en cuanto llegas a un
GOo al final del script. - Rendimiento: NO tienen Estadísticas. El motor asume siempre que tienen 1 fila.
- Si tienes 10 filas: Son rapidísimas (menos bloqueos).
- Si tienes 1.000.000 filas: El rendimiento será terrible porque el motor elegirá un mal plan de ejecución.
- Transacciones: NO participan en el
ROLLBACK. Si abres una transacción, insertas en la variable y haces rollback, los datos se quedan en la variable.
Declaración y uso de variables de tabla
Para declarar una variable de tabla, utilizamos la palabra clave DECLARE seguida del nombre de la variable y la definición de la tabla. Aquí tienes un ejemplo:
DECLARE @MiVariableTabla TABLE (
ID INT PRIMARY KEY,
Nombre NVARCHAR(50),
FechaCreacion DATETIME
);
Luego, puedes insertar datos en la variable de tabla:
INSERT INTO @MiVariableTabla (ID, Nombre, FechaCreacion)
VALUES (1, 'Ejemplo', GETDATE());
Y consultar los datos:
SELECT * FROM @MiVariableTabla;
Eliminación de Variables de Tabla
Las variables de tabla se eliminan automáticamente cuando el bloque de código en el que se declaran termina su ejecución. No es necesario eliminarlas manualmente.
