Una tabla temporal SQL almacena un subconjunto de datos de una tabla normal durante un cierto período de tiempo. Se almacenan dentro de «tempdb», la cual pertenece a SQL server.
Esta son útiles cuando tiene una gran cantidad de registros en una tabla y necesita interactuar repetidamente con un pequeño subconjunto de esos registros. En tales casos, en lugar de consultar los datos una y otra vez para recuperar el subconjunto, puede filtrar los datos una vez y almacenarlos en una tabla temporal SQL. Luego puede ejecutar sus consultas en esa tabla temporal.
Tipos de tablas temporales sql sever:
- Tablas Temporales Locales: Son las tablas almacenadas en tempDB. Estos tipos de tablas solo son accesibles para la sesión que las produjo. Cuando finaliza el procedimiento o la sesión, estas tablas se destruyen automáticamente. Por ejemplo , si creamos una tabla temporal SQL local llamada #mi_tabla, el usuario solo puede realizar funciones en la tabla hasta que finalice la última conexión a la ventana de consulta. Se identifican con el prefijo # , por ejemplo, #table name , y la misma tabla temporal se puede establecer en numerosas ventanas con el mismo nombre.
- Tablas Temporales Globales: El nombre comienza con el símbolo de doble hash («##») y se almacena en tempdb. Están disponibles para todos los usuarios en una instancia. Estas tablas se eliminarán automáticamente si todos los usuarios se desconectan de su sesión.
Crear una tabla temporal SQL server de uso local
Hay dos métodos para crear tablas temporales en SQL.
Método 1
La forma más sencilla de crear una tabla temporal SQL es mediante una declaración INTO dentro de una consulta SELECT. observa el siguiente ejemplo.
USE ejemplo SELECT nombre, pais, sexo INTO #clientes FROM Cliente WHERE pais = 'Mexico'
Echa un vistazo a la consulta anterior. Aquí creamos una tabla temporal SQL «#Clientes» que almacena el nombre, el pais y el sexo de todos los registros de clientes Mexicanos de la tabla de cliente. Para definir una tabla temporal, usamos la instrucción INTO después de la instrucción SELECT. El nombre de una tabla temporal debe comenzar con un hash (#).
Ahora, a ver dónde existe esta tabla temporal SQL; vaya a la carpeta Bases de datos -> luego a la carpeta Bases de datos del sistema-> despliegue la base de datos tempdb -> y la centrara en la carpeta Tablas temporales«. Verá el nombre de su tabla temporal junto con el identificador. Fíjate en la siguiente figura:
Se puede notar en la imagen anterior un identificador único «000000000013». Esto se debe a que diferentes conexiones pueden crear tablas temporales con nombres similares.
Puede realizar operaciones en la tabla temporal SQL a través de la misma conexión que la creó. Por lo tanto, en la misma ventana de consulta que creó la tabla “#Clientes”, ejecute la siguiente consulta.
SELECT * FROM #Clientes
La consulta anterior obtendrá los resultados de la tabla temporal SQL creada.
Cree una nueva conexión a la instancia, abriendo el «SQL Server Management Studio» de nuevo. Ahora, mantenga abierta la conexión anterior y cree otra tabla «clientes» usando el método 2 en una nueva ventana de consulta (nueva conexión).
Método 2
El segundo método es similar a la creación de tablas en SQL de forma normal. como en el siguiente ejemplo. Aquí nuevamente, crearemos la tabla temporal SQL #Clientes. Recuerde, esta consulta debe ser ejecutada por una nueva conexión.
USE ejemplo CREATE TABLE #Clientes ( Nombre VARCHAR(50), Pais VARCHAR(50), Sexo VARCHAR(50) ) INSERT INTO #Clientes SELECT Nombre, Pais, Sexo FROM Cliente WHERE Sexo = 'Masculino'
Ahora, si ejecuta la consulta anterior, debería ver dos tablas temporales SQL #Clientes con diferentes identificadores únicos dentro de tempdb. Ya que, estas tablas fueron creadas por dos conexiones diferentes. En la siguiente imagen pude ver la tabla temporal #Clientes.
Tablas temporales globales
Es pertinente mencionar aquí que solo la conexión que creó esa tabla temporal SQL puede acceder a una tabla temporal. No es accesible a otras conexiones. Sin embargo, podemos crear tablas temporales que sean accesibles para todas las conexiones abiertas; esto lo podemos hacer con tablas temporales globales. El nombre de la tabla temporal global comienza con un símbolo de almohadilla doble (##). Veamos el siguiente ejemplo.
USE ejemplo
SELECT nombre, pais, sexo
INTO ##clientes
FROM Cliente
WHERE pais = 'Mexico'
Ahora, puede acceder a la tabla ##Clientes desde cualquiera de las conexiones abiertas.
para crear este tipo de tabla, es similar al ejemplo de tabla temporal local, lo único que esta tiene dos símbolos hash en lugar de uno.
Eliminación de una tabla temporal SQL server
Hay dos formas de eliminar tablas temporales en SQL Server: eliminación automática y eliminación manual.
Eliminación automática
Una tabla temporal SQL se elimina automáticamente cuando se cierra la conexión que creó la tabla. Alternativamente, cuando cierre la ventana de consulta que creó la tabla temporal, sin guardar los cambios, la tabla se cerrará. Si una conexión está ejecutando algunas consultas en la tabla global, esas consultas deben completarse primero antes de que se elimine la tabla global.
Eliminación manual de tablas
Puede eliminar manualmente una tabla sin cerrar una conexión con DROP TABLE. Sin embargo, recuerde que la declaración debe ser ejecutada por la conexión donde se creó la tabla. Ejemplo:
DROP TABLE #Clientes
Esto es similar a eliminar una tabla normal.
Tablas Temporales y Procedimientos Almacenados
Anteriormente aprendimos que solo se puede acceder localmente a una tabla temporal SQL dentro de la conexión que la creó. Tenemos una excepción; cuando crea procedimientos almacenados, también puede acceder a tablas temporales SQL en otras conexiones.
Vamos a crear dos procedimientos almacenados usando dos conexiones diferentes. El primer procedimiento almacenado insertará datos en la tabla #Clientes, mientras que el segundo seleccionará los datos de la tabla.
Cree una nueva conexión y ejecute el siguiente script SQL en la nueva ventana de consulta.
CREATE PROCEDURE spInsertCliente (@Nombre Varchar(50), @Pais VARCHAR(50), @Sexo Varchar(50)) AS BEGIN INSERT INTO #Clientes SELECT Nombre, Pais, Sexo FROM Cliente WHERE Sexo = 'Masculino' end
Ahora hemos creado un procedimiento almacenado que inserta registro en la tabla temporal #Clientes. Puede acceder a las tablas temporales desde una conexión distinta de la que creó la tabla. Si ejecuta la consulta anterior, verá que SQL Server no arrojará ningún error.
Del mismo modo, abra una nueva conexión y cree el siguiente procedimiento almacenado en ella:
CREATE PROCEDURE spListCliente AS BEGIN SELECT * FROM #Clientes ORDER BY nombre END
El procedimiento almacenado anterior selecciona todos los registros de la tabla temporal #Clientes. En este ejemplo tenemos conexión a la tabla temporal #Clientes desde otra conexión.
Ahora esta es la parte difícil. Aunque puede acceder a una tabla temporal dentro de otra conexión cuando crea un procedimiento almacenado, no puede acceder a una tabla temporal cuando «ejecuta» un procedimiento almacenado dentro de otra conexión. Para ejecutar un procedimiento almacenado que acceda a una tabla temporal, debe estar dentro de la conexión que creó la tabla temporal.
Por lo tanto, ejecute las siguientes consultas dentro de la conexión que creó la tabla #Clientes.
EJECUTE spInsertCliente Bradley, españa, Hombre
Ejecute spListCliente
Aquí, el primer procedimiento almacenado inserta un nuevo registro de estudiante con el nombre: Bradley, pais: españa y sexo: hombre en la tabla #Clientes. El segundo procedimiento almacenado selecciona todos los registros de la tabla #clientes en orden ascendente de nombre.