I SQL Server oprettes midlertidige tabeller ved hjælp af den samme CREATE TABLE
syntaks som almindelige tabeller. Forskellen er, at midlertidige tabellers navne er præfikset med enten et eller to taltegn (#
), afhængigt af om det er en lokal midlertidig tabel eller global midlertidig tabel:
- Lokale midlertidige tabeller er præfikset med et enkelt taltegn (
#
) - Globale midlertidige tabeller er præfikset med et dobbelt taltegn (
##
)
Eksempel 1 – Opret en lokal midlertidig tabel
Her er et eksempel på oprettelse af en lokal midlertidig tabel:
CREATE TABLE #Cats ( CatId int PRIMARY KEY, CatName varchar(70) );
Det navn, du angiver for en lokal midlertidig tabel, kan maksimalt være på 116 tegn. Andre tabeltyper kan være på 128 tegn, men lokale midlertidige tabeller tilføjes automatisk med et systemgenereret numerisk suffiks.
Eksempel 2 – Opret en global midlertidig tabel
Her er et eksempel på oprettelse af en global midlertidig tabel:
CREATE TABLE ##Cats ( CatId int PRIMARY KEY, CatName varchar(70) );
Globale midlertidige tabelnavne kan maksimalt være på 128 tegn. SQL Server tilføjer ikke et systemgenereret numerisk suffiks til globale midlertidige tabeller, som det gør for lokale midlertidige tabeller, så du kan bruge den fulde plads.
Eksempel 3 – Se de midlertidige tabeller
Jeg kan køre følgende forespørgsel for at se mine nyoprettede midlertidige tabeller.
SELECT name FROM tempdb.sys.tables WHERE name LIKE '#Cats%' OR name = '##Cats';
Resultat:
+----------------------------------------------------------------------------------------------------------------------------------+ | name | |----------------------------------------------------------------------------------------------------------------------------------| | ##Cats | | #Cats_______________________________________________________________________________________________________________000000000018 | +----------------------------------------------------------------------------------------------------------------------------------+
Vi kan se, at den lokale midlertidige tabel har fået tilføjet det systemgenererede numeriske suffiks, og det er derfor, min forespørgsel bruger LIKE
operator for den tabel.
Eksempel 4 – Ny session
Hvis jeg åbner en ny session, opretter en lokal midlertidig tabel med samme navn (Katte), og kør derefter denne forespørgsel igen, jeg får dette:
+----------------------------------------------------------------------------------------------------------------------------------+ | name | |----------------------------------------------------------------------------------------------------------------------------------| | ##Cats | | #Cats_______________________________________________________________________________________________________________000000000018 | | #Cats_______________________________________________________________________________________________________________000000000019 | +----------------------------------------------------------------------------------------------------------------------------------+
Så flere sessioner kan oprette en lokal tabel med samme navn, fordi SQL Server ændrer dette navn ved at øge suffikset.
Eksempel 5 – Samme session
Men hvis jeg prøver at oprette den lokale midlertidige tabel igen i samme session, får jeg dette:
Msg 2714, Level 16, State 6, Line 1 There is already an object named '#Cats' in the database.
Og hvis jeg åbner endnu en session, har jeg succes, og når jeg forespørger tempdb.sys.tables
Jeg forstår dette:
+----------------------------------------------------------------------------------------------------------------------------------+ | name | |----------------------------------------------------------------------------------------------------------------------------------| | ##Cats | | #Cats_______________________________________________________________________________________________________________000000000018 | | #Cats_______________________________________________________________________________________________________________000000000019 | | #Cats_______________________________________________________________________________________________________________00000000001B | +----------------------------------------------------------------------------------------------------------------------------------+