En midlertidig tabel i SQL Server, som navnet antyder, er en databasetabel, der eksisterer midlertidigt på databaseserveren. En midlertidig tabel gemmer en delmængde af data fra en normal tabel i et bestemt tidsrum.
Midlertidige tabeller er især nyttige, når du har et stort antal poster i en tabel, og du gentagne gange har brug for at interagere med en lille delmængde af disse poster. I sådanne tilfælde i stedet for at filtrere dataene igen og igen for at hente delsættet, kan du filtrere dataene én gang og gemme dem i en midlertidig tabel. Du kan derefter udføre dine forespørgsler på den midlertidige tabel. Midlertidige tabeller er gemt i "tempdb", som er en systemdatabase. Lad os tage et kig på, hvordan du kan bruge en midlertidig data i et simpelt scenarie.
Forberedelse af data
Lad os først forberede nogle dummy-data. Vi vil bruge disse data til at oprette midlertidige tabeller.
Kør følgende script på din databaseserver.
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);
Ovenstående SQL-script opretter en database 'schooldb'. I denne database oprettes en tabel kaldet 'elev', og nogle dummy-data tilføjes i tabellen.
Oprettelse af en midlertidig tabel
Der er to metoder til at oprette midlertidige tabeller.
Metode 1
Den enkleste måde at oprette en midlertidig tabel på er ved at bruge en INTO-sætning i en SELECT-forespørgsel. Lad os oprette en midlertidig tabel, der indeholder navn, alder og køn på alle mandlige elevposter fra elevtabellen.
USE schooldb; SELECT name, age, gender INTO #MaleStudents FROM student WHERE gender = 'Male'
Tag et kig på ovenstående forespørgsel. Her har vi oprettet en midlertidig tabel "#Mandstuderende", som gemmer navn, alder og køn på alle mandlige elevposter fra elevtabellen. For at definere en midlertidig tabel bruger vi INTO-sætningen efter SELECT-sætningen. Navnet på en midlertidig tabel skal starte med en hash (#).
For nu at se, hvor denne tabel findes; gå til "Object Explorer -> Databaser -> System Databases-> tempdb -> Midlertidige tabeller". Du vil se dit midlertidige tabelnavn sammen med identifikatoren. Tag et kig på følgende figur:
Du må undre dig over "000000000006" i slutningen af tabelnavnet. Dette er en unik identifikator. Flere databaseforbindelser kan oprette midlertidige tabeller med det samme navn. Derfor tilføjer databaseserveren automatisk denne unikke identifikator til sidst for at skelne mellem de midlertidige tabeller, der er oprettet af forskellige forbindelser.
Du kan udføre operationer på den midlertidige tabel via den samme forbindelse, som oprettede den. Udfør derfor følgende forespørgsel i det samme forespørgselsvindue, som oprettede "#MaleStudents"-tabellen.
SELECT * FROM #MaleStudents
Siden indeholder #MaleStudents-tabellen navn, alder og køn på alle de mandlige elever. Ovenstående forespørgsel vil hente følgende resultater.
[tabel id=15 /]
For at oprette en ny forbindelse kan du blot åbne et nyt forespørgselsvindue i "SQL Server Management Studio". Hold nu den tidligere forbindelse åben, og opret endnu en "Mandstuderende"-tabel ved hjælp af metode 2 i et nyt forespørgselsvindue (ny forbindelse).
Metode 2
Den anden metode ligner at skabe normale tabeller. Tag et kig på følgende forespørgsel. Her skal vi igen oprette #MaleStudents midlertidige tabel. Husk, at denne forespørgsel skal udføres af en ny forbindelse.
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'
Nu, hvis du udfører ovenstående forespørgsel, bør du se to #MaleStudents midlertidige tabeller med forskellige unikke identifikatorer inde i tempdb. Dette skyldes, at disse to tabeller er blevet oprettet af to forskellige forbindelser. Tag et kig på følgende skærmbillede.
Globale midlertidige tabeller
Det er relevant at nævne her, at en midlertidig tabel kun er tilgængelig for den forbindelse, der skabte den midlertidige tabel. Det er ikke tilgængeligt for andre forbindelser. Vi kan dog lave midlertidige tabeller, der er tilgængelige for alle de åbne forbindelser. Sådanne midlertidige tabeller kaldes globale midlertidige tabeller. Navnet på den globale midlertidige tabel starter med et dobbelt hash-symbol (##). Lad os oprette en global midlertidig tabel, der indeholder registreringer af alle kvindelige studerende fra elevbordet.
USE schooldb; SELECT name, age, gender INTO ##FemaleStudents FROM student WHERE gender = 'Female'
Nu kan du få adgang til tabellen ##Female Students fra enhver af de åbne forbindelser.
Sletning af en midlertidig tabel
Der er to måder at slette midlertidige tabeller i SQL Server:Automatisk sletning og manuel sletning.
Automatisk sletning
En midlertidig tabel slettes automatisk, når forbindelsen, der oprettede tabellen, lukkes. Alternativt, når du lukker forespørgselsvinduet, der oprettede den midlertidige tabel, uden at gemme ændringerne, lukkes tabellen. Hvis en forbindelse udfører nogle forespørgsler på den globale tabel, skal disse forespørgsler udføres først, før den globale tabel slettes.
Manuel tabelsletning
Du kan manuelt slette en tabel uden at lukke en forbindelse ved at bruge DROP TABLE-sætningen. Husk dog, at sætningen skal udføres af den forbindelse, der faktisk skabte tabellen. Tag et kig på følgende forespørgsel:
DROP TABLE #MaleStudents
Dette svarer til at slette en normal tabel.
Midlertidige tabeller og lagrede procedurer
Tidligere lærte vi, at en midlertidig tabel kun kan tilgås lokalt inde i forbindelsen, der skabte den. Der er én undtagelse fra den regel. Når du opretter lagrede procedurer, kan du også få adgang til midlertidige tabeller i andre forbindelser.
Lad os oprette to lagrede procedurer ved hjælp af to forskellige forbindelser. Den første lagrede procedure vil indsætte data i #MaleStudents-tabellen, mens den anden vil vælge dataene fra tabellen.
Opret en ny forbindelse. Hvis du bruger SQL Server Management Studio, kan du gøre det ved at åbne et nyt forespørgselsvindue. Udfør følgende SQL-script i det nye forespørgselsvindue.
Create Procedure spInsertStudent (@Name Varchar(50), @Age int, @Gender Varchar(50)) As Begin Insert Into #MaleStudents Values (@Name, @Age, @Gender) End
Vi har nu oprettet en lagret procedure, der indsætter en post i den midlertidige #MaleStudent-tabel. Bemærk, at denne forbindelse ikke skabte #MaleStudent, men alligevel får vi adgang til den ved at indsætte en post i den. Dette skyldes, at når du opretter en lagret procedure, kan du få adgang til midlertidige tabeller fra en anden forbindelse end den, der oprettede tabellen. Hvis du udfører ovenstående forespørgsel, vil du se, at SQL Server ikke giver nogen fejl.
På samme måde skal du åbne en ny forbindelse og oprette følgende lagrede procedure i den:
CREATE PROCEDURE spListStudent AS BEGIN SELECT * FROM #MaleStudents ORDER BY name END
Ovenstående lagrede procedure vælger alle posterne fra #MaleStudents midlertidige tabel. Her får vi igen adgang til en midlertidig tabel inde i en forbindelse, der ikke oprettede tabellen.
Nu er her den vanskelige del. Selvom du kan få adgang til en midlertidig tabel inde i en anden forbindelse, når du opretter en lagret procedure, kan du ikke få adgang til en midlertidig tabel, når du "udfører" en lagret procedure i en anden forbindelse. For at udføre en lagret procedure, der får adgang til en midlertidig tabel, skal du være inde i den forbindelse, der oprettede den midlertidige tabel.
Udfør derfor følgende forespørgsler inde i forbindelsen, der skabte #MaleStudents-tabellen.
EXECUTE spInsertStudent Bradley, 45, Male Execute spListStudent
Her indsætter den første lagrede procedure en ny elevrekord med navnet:Bradley, alder:45 og køn:Mand i #MandStudents-tabellen. Den anden lagrede procedure vælger alle posterne fra #Mandlige Studerende-tabellen i stigende rækkefølge efter navn. Outputtet af ovenstående lagrede procedurer vil være:
[tabel id=16 /]
Du kan tydeligt se vores nyligt indsatte post i de valgte poster ovenfor.
Se også:
Ydeevne af tabelvariabler i SQL Server
Introduktion af almindelige tabeludtryk i SQL Server