sql >> Base de Datos >  >> RDS >> Sqlserver

Introducción a las tablas temporales en SQL Server

Una tabla temporal en SQL Server, como sugiere el nombre, es una tabla de base de datos que existe temporalmente en el servidor de la base de datos. Una tabla temporal almacena un subconjunto de datos de una tabla normal durante un cierto período de tiempo.

Las tablas temporales son particularmente ú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 filtrar los datos una y otra vez para recuperar el subconjunto, puede filtrar los datos una vez y almacenarlos en una tabla temporal. Luego puede ejecutar sus consultas en esa tabla temporal. Las tablas temporales se almacenan dentro de "tempdb", que es una base de datos del sistema. Echemos un vistazo a cómo puede usar datos temporales en un escenario simple.

Preparación de los datos

Primero preparemos algunos datos ficticios. Usaremos estos datos para crear tablas temporales.

Ejecute el siguiente script en su servidor de base de datos.

CREATE DATABASE schooldb

CREATE TABLE student
(
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    gender VARCHAR(50) NOT NULL,
    age INT NOT NULL,
    total_score INT NOT NULL,
    
 )


INSERT INTO student 

VALUES (1, 'Jolly', 'Female', 20, 500), 
(2, 'Jon', 'Male', 22, 545), 
(3, 'Sara', 'Female', 25, 600), 
(4, 'Laura', 'Female', 18, 400), 
(5, 'Alan', 'Male', 20, 500), 
(6, 'Kate', 'Female', 22, 500), 
(7, 'Joseph', 'Male', 18, 643), 
(8, 'Mice', 'Male', 23, 543), 
(9, 'Wise', 'Male', 21, 499), 
(10, 'Elis', 'Female', 27, 400);

El script SQL anterior crea una base de datos 'schooldb'. En esta base de datos, se crea una tabla llamada "estudiante" y se agregan algunos datos ficticios a la tabla.

Crear una tabla temporal

Hay dos métodos para crear tablas temporales.

Método 1

La forma más sencilla de crear una tabla temporal es mediante una declaración INTO dentro de una consulta SELECT. Vamos a crear una tabla temporal que contenga el nombre, la edad y el sexo de todos los registros de estudiantes varones de la tabla de estudiantes.

USE schooldb;

SELECT name, age, gender
INTO #MaleStudents
FROM student
WHERE gender = 'Male'

Echa un vistazo a la consulta anterior. Aquí creamos una tabla temporal "#MaleStudents" que almacena el nombre, la edad y el sexo de todos los registros de estudiantes masculinos de la tabla de estudiantes. 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; vaya a "Explorador de objetos -> Bases de datos -> Bases de datos del sistema-> tempdb -> Tablas temporales". Verá el nombre de su tabla temporal junto con el identificador. Fíjate en la siguiente figura:

Debe estar preguntándose sobre el "000000000006" al final del nombre de la tabla. Este es un identificador único. Múltiples conexiones de bases de datos pueden crear tablas temporales con el mismo nombre, por lo tanto, para diferenciar entre las tablas temporales creadas por diferentes conexiones, el servidor de la base de datos agrega automáticamente este identificador único al final.

Puede realizar operaciones en la tabla temporal a través de la misma conexión que la creó. Por lo tanto, en la misma ventana de consulta que creó la tabla “#MaleStudents”, ejecute la siguiente consulta.

SELECT * FROM #MaleStudents

Dado que la tabla #MaleStudents contiene el nombre, la edad y el sexo de todos los estudiantes varones. La consulta anterior obtendrá los siguientes resultados.

[identificación de la tabla=15 /]

Para crear una nueva conexión, simplemente puede abrir una nueva ventana de consulta en "SQL Server Management Studio". Ahora, mantenga abierta la conexión anterior y cree otra tabla "MaleStudents" 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 normales. Echa un vistazo a la siguiente consulta. Aquí nuevamente, crearemos la tabla temporal #MaleStudents. Recuerde, esta consulta debe ser ejecutada por una nueva conexión.

USE schooldb;

CREATE TABLE #MaleStudents
(
	name VARCHAR(50),
	age int,
	gender VARCHAR (50)

)

INSERT INTO #MaleStudents
SELECT name, age, gender
FROM student
WHERE gender = 'Male'

Ahora, si ejecuta la consulta anterior, debería ver dos tablas temporales #MaleStudents con diferentes identificadores únicos dentro de tempdb. Esto se debe a que estas dos tablas han sido creadas por dos conexiones diferentes. Echa un vistazo a la siguiente captura de pantalla.

Tablas temporales globales

Es pertinente mencionar aquí que solo la conexión que creó esa tabla temporal puede acceder a una tabla temporal. No es accesible para otras conexiones. Sin embargo, podemos crear tablas temporales que sean accesibles para todas las conexiones abiertas. Estas tablas temporales se denominan tablas temporales globales. El nombre de la tabla temporal global comienza con un símbolo de almohadilla doble (##). Vamos a crear una tabla temporal global que contenga registros de todas las alumnas de la tabla de estudiantes.

USE schooldb;

SELECT name, age, gender
INTO ##FemaleStudents
FROM student
WHERE gender = 'Female'

Ahora, puede acceder a la tabla ##FemaleStudents desde cualquiera de las conexiones abiertas.

Eliminar una tabla temporal

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 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 mediante la instrucción DROP TABLE. Sin embargo, recuerde que la declaración debe ser ejecutada por la conexión que realmente creó la tabla. Echa un vistazo a la siguiente consulta:

DROP TABLE #MaleStudents

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 dentro de la conexión que la creó. Hay una excepción a esa regla. Cuando crea procedimientos almacenados, también puede acceder a tablas temporales en otras conexiones.

Vamos a crear dos procedimientos almacenados usando dos conexiones diferentes. El primer procedimiento almacenado insertará datos en la tabla #MaleStudents, mientras que el segundo seleccionará los datos de la tabla.

Cree una nueva conexión. Si está utilizando SQL Server Management Studio, puede hacerlo abriendo una nueva ventana de consulta. Ejecute el siguiente script SQL en la nueva ventana de consulta.

Create Procedure spInsertStudent
    (@Name Varchar(50), @Age int,  @Gender Varchar(50))
As
Begin
    Insert Into #MaleStudents
    Values (@Name, @Age, @Gender)
End

Ahora hemos creado un procedimiento almacenado que inserta un registro en la tabla temporal #MaleStudent. Tenga en cuenta que esta conexión no creó el #MaleStudent, pero estamos accediendo insertando un registro en él. Esto se debe a que, al crear un procedimiento almacenado, 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 spListStudent
AS
BEGIN

	SELECT * FROM #MaleStudents
	ORDER BY name
END

El procedimiento almacenado anterior selecciona todos los registros de la tabla temporal #MaleStudents. Aquí nuevamente, estamos accediendo a una tabla temporal dentro de una conexión que no creó la tabla.

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 #MaleStudents.

EXECUTE spInsertStudent Bradley, 45, Male
Execute spListStudent

Aquí, el primer procedimiento almacenado inserta un nuevo registro de estudiante con el nombre:Bradley, edad:45 y sexo:hombre en la tabla #MaleStudents. El segundo procedimiento almacenado selecciona todos los registros de la tabla #MaleStudents en orden ascendente de nombre. La salida de los procedimientos almacenados anteriores será:

[identificación de la tabla=16 /]

Puede ver claramente nuestro registro recién insertado en los registros seleccionados arriba.

Ver también:

Rendimiento de las variables de tabla en SQL Server

Introducción a las expresiones de tabla comunes en SQL Server