Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Introduzione alle tabelle temporanee in SQL Server

Una tabella temporanea in SQL Server, come suggerisce il nome, è una tabella di database che esiste temporaneamente sul server di database. Una tabella temporanea memorizza un sottoinsieme di dati da una tabella normale per un certo periodo di tempo.

Le tabelle temporanee sono particolarmente utili quando si dispone di un numero elevato di record in una tabella ed è necessario interagire ripetutamente con un piccolo sottoinsieme di tali record. In questi casi invece di filtrare i dati più e più volte per recuperare il sottoinsieme, puoi filtrare i dati una volta e archiviarli in una tabella temporanea. È quindi possibile eseguire le query su quella tabella temporanea. Le tabelle temporanee sono archiviate all'interno di "tempdb", che è un database di sistema. Diamo un'occhiata a come puoi utilizzare un dato temporaneo in uno scenario semplice.

Preparazione dei dati

Prepariamo prima alcuni dati fittizi. Useremo questi dati per creare tabelle temporanee.

Esegui il seguente script sul tuo server di database.

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);

Lo script SQL precedente crea un database "schooldb". In questo database viene creata una tabella chiamata "studente" e nella tabella vengono aggiunti alcuni dati fittizi.

Creazione di una tabella temporanea

Esistono due metodi per creare tabelle temporanee.

Metodo 1

Il modo più semplice per creare una tabella temporanea consiste nell'usare un'istruzione INTO all'interno di una query SELECT. Creiamo una tabella temporanea che contenga il nome, l'età e il sesso di tutti i record degli studenti maschi dalla tabella degli studenti.

USE schooldb;

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

Dai un'occhiata alla domanda di cui sopra. Qui abbiamo creato una tabella temporanea "#MaleStudents" che memorizza il nome, l'età e il sesso di tutti i record degli studenti maschi dalla tabella degli studenti. Per definire una tabella temporanea, utilizziamo l'istruzione INTO dopo l'istruzione SELECT. Il nome di una tabella temporanea deve iniziare con un hash (#).

Ora, per vedere dove esiste questa tabella; vai su "Esplora oggetti -> Database -> Database di sistema-> tempdb -> Tabelle temporanee". Vedrai il nome della tabella temporanea insieme all'identificatore. Dai un'occhiata alla figura seguente:

Ti starai chiedendo "000000000006" alla fine del nome della tabella. Questo è un identificatore univoco. Più connessioni al database possono creare tabelle temporanee con lo stesso nome, quindi per differenziare le tabelle temporanee create da connessioni diverse, il server del database aggiunge automaticamente questo identificatore univoco alla fine.

È possibile eseguire operazioni sulla tabella temporanea tramite la stessa connessione che l'ha creata. Pertanto, nella stessa finestra di query che ha creato la tabella "#MaleStudents", eseguire la query seguente.

SELECT * FROM #MaleStudents

Poiché, la tabella #MaleStudents contiene il nome, l'età e il sesso di tutti gli studenti maschi. La query precedente recupererà i seguenti risultati.

[id tabella=15 /]

Per creare una nuova connessione puoi semplicemente aprire una nuova finestra di query in "SQL Server Management Studio". Ora, mantieni aperta la connessione precedente e crea un'altra tabella "MaleStudents" usando il metodo 2 in una nuova finestra di query (nuova connessione).

Metodo 2

Il secondo metodo è simile alla creazione di tabelle normali. Dai un'occhiata alla seguente domanda. Anche in questo caso creeremo la tabella temporanea #MaleStudents. Ricorda, questa query deve essere eseguita da una nuova connessione.

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'

Ora, se esegui la query precedente, dovresti vedere due tabelle temporanee #MaleStudents con identificatori univoci diversi all'interno del tempdb. Questo perché queste due tabelle sono state create da due diverse connessioni. Dai un'occhiata allo screenshot seguente.

Tabelle temporanee globali

È pertinente menzionare qui che una tabella temporanea è accessibile solo alla connessione che ha creato quella tabella temporanea. Non è accessibile ad altre connessioni. Tuttavia, possiamo creare tabelle temporanee accessibili a tutte le connessioni aperte. Tali tabelle temporanee sono chiamate tabelle temporanee globali. Il nome della tabella temporanea globale inizia con un doppio cancelletto (##). Creiamo una tabella temporanea globale che contenga i record di tutte le studentesse dalla tabella degli studenti.

USE schooldb;

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

Ora puoi accedere alla tabella ##FemaleStudents da qualsiasi connessione aperta.

Eliminazione di una tabella temporanea

Esistono due modi per eliminare le tabelle temporanee in SQL Server:eliminazione automatica ed eliminazione manuale.

Eliminazione automatica

Una tabella temporanea viene eliminata automaticamente alla chiusura della connessione che ha creato la tabella. In alternativa, quando si chiude la finestra della query che ha creato la tabella temporanea, senza salvare le modifiche la tabella verrà chiusa. Se una connessione sta eseguendo alcune query sulla tabella globale, tali query devono essere completate prima che la tabella globale venga eliminata.

Eliminazione manuale della tabella

È possibile eliminare manualmente una tabella senza chiudere una connessione utilizzando l'istruzione DROP TABLE. Tuttavia, ricorda che l'istruzione deve essere eseguita dalla connessione che ha effettivamente creato la tabella. Dai un'occhiata alla seguente query:

DROP TABLE #MaleStudents

È simile all'eliminazione di una tabella normale.

Tabelle temporanee e stored procedure

In precedenza abbiamo appreso che è possibile accedere a una tabella temporanea solo localmente all'interno della connessione che l'ha creata. C'è un'eccezione a questa regola. Durante la creazione di stored procedure, è possibile accedere alle tabelle temporanee anche in altre connessioni.

Creiamo due stored procedure utilizzando due diverse connessioni. La prima stored procedure inserirà i dati nella tabella #MaleStudents, mentre la seconda selezionerà i dati dalla tabella.

Crea una nuova connessione. Se utilizzi SQL Server Management Studio, puoi farlo aprendo una nuova finestra di query. Esegui il seguente script SQL nella nuova finestra della query.

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

Ora abbiamo creato una procedura memorizzata che inserisce un record nella tabella temporanea #MaleStudent. Si noti che questa connessione non ha creato il #MaleStudent, eppure vi accediamo inserendo un record al suo interno. Questo perché durante la creazione di una stored procedure è possibile accedere alle tabelle temporanee da una connessione diversa da quella che ha creato la tabella. Se esegui la query precedente, vedrai che SQL Server non genererà alcun errore.

Allo stesso modo, apri una nuova connessione e crea la seguente stored procedure:

CREATE PROCEDURE spListStudent
AS
BEGIN

	SELECT * FROM #MaleStudents
	ORDER BY name
END

La procedura memorizzata sopra seleziona tutti i record dalla tabella temporanea #MaleStudents. Anche in questo caso, stiamo accedendo a una tabella temporanea all'interno di una connessione che non ha creato la tabella.

Ora ecco la parte difficile. Sebbene sia possibile accedere a una tabella temporanea all'interno di un'altra connessione durante la creazione di una procedura memorizzata, non è possibile accedere a una tabella temporanea quando si "esegue" una procedura memorizzata all'interno di un'altra connessione. Per eseguire una procedura memorizzata che acceda a una tabella temporanea, devi essere all'interno della connessione che ha creato la tabella temporanea.

Pertanto, esegui le seguenti query all'interno della connessione che ha creato la tabella #MaleStudents.

EXECUTE spInsertStudent Bradley, 45, Male
Execute spListStudent

Qui la prima stored procedure inserisce un nuovo record studente con il nome:Bradley, età:45 e sesso:Maschio nella tabella #MaleStudents. La seconda procedura memorizzata seleziona tutti i record dalla tabella #MaleStudents in ordine crescente di nome. L'output delle procedure memorizzate di cui sopra sarà:

[id tabella=16 /]

Puoi vedere chiaramente il nostro record appena inserito nei record selezionati sopra.

Vedi anche:

Prestazioni delle variabili di tabella in SQL Server

Presentazione delle espressioni di tabella comuni in SQL Server