Temporära tabeller

Temporära används för lagring av temporär data, en slags mellanhand. De fungerar som vanliga tabeller och kan användas på samma sätt. För att skilja de från vanliga tabeller används prefixet # före namnet. Temporära tabeller kan endast kommas åt från den anslutningen som skapade den, men med globala temporära tabeller kan man komma åt dem från alla anslutningar.

Temporära tabeller tas bort automatiskt när anslutningen som skapade den stängs. Det gäller även för globala temporära tabeller, med undantag för om det vid tillfället som anslutningen stängs, utförs någon annan SQL-kod mot den temporära tabellen. Då raderas den efter att alla dessa transaktioner har slutförts.

Varje temporär tabell som du skapar får automatiskt ett unikt nummer i slutet på namnet, vilket gör att du inte behöver bekymra dig om att det finns någon annan med samma namn. Om du har fler än en tabell i samma batch eller lagrade procedur, måste de dock ha olika namn. När du refererar till den använder du dock bara den delen som du har namngett.

Främmande nycklar kan användas mellan de temporära tabellerna, men av förklarliga skäl, inte med referenser till de vanliga tabellerna.

Skapa en temporär tabell

Metod ett

Den här metoden går ut på att du väljer de poster som ska visas i en tabell, men i stället för att visa dem, lägger du in de i en temporär tabell med INTO och sedan ett namn för tabellen med prefixet #. På så sätt skapas också den temporära tabellen. För att visa dessa poster använder man sedan SELECT på den temporära tabellen.

SELECT
    ReceptNamn
INTO 
    #FavoritRecept
FROM
    Recept
WHERE
    ReceptNamn = 'Vårrullar'

SELECT * FROM #FavoritRecept

Metod två

Här skapar vi den temporära tabellen först och väljer namn för kolumner och datatyp. Sedan hämtar vi information med SELECT på samma sätt som den första metoden, utan INTO-satsen. I stället använder vi INSERT INTO och tabellnamnet efter prefixet #, innan vi skriver SELECT-satsen. Då kommer resultatet av SELECT-satsen läggas in i den nya temporära tabellen. Det måste vara lika många valda kolumner i SELECT-satsen som i den temporära tabellen.

CREATE TABLE #FavoritRecept(
    FavoritRecept nvarchar(100)
);

INSERT INTO 
    #FavoritRecept
SELECT
    ReceptNamn
FROM
    Recept
WHERE
    ReceptNamn = 'Vårrullar'

SELECT * FROM #FavoritRecept

Globala temporära tabeller

För att skapa en global temporär tabell använder man prefixet ##. I tempdb sparas namnet exakt som du skriver, utan någon unik identifierare. Detta eftersom den kan refereras från alla anslutningar. Det innebär att jag kan skapa en helt ny fråga och hämta resultatet från den här tabellen. Även om det här fungerar, finns det nog ingen stor anledning att använda en global temporär tabell, för har man många tabeller som behöver det här resultatet är det bättre att skapa en permanent tabell.

Temporära tabeller och lagrade procedurer

Det går att inkludera temporära tabeller i lagrade procedurer, även om de inte existerar i den anslutningen. Däremot går det inte att köra de i någon annan anslutning än där de skapades. Temporära tabeller som skapas i den lagrade proceduren, raderas när den lagrade proceduren har slutfört sin körning. Om en lagrad procedur skapar en temporär tabell och anropar en annan lagrad procedur, kommer den andre kunna använda den temporära tabellen som skapades i den första lagrade proceduren.

Radera temporära tabeller

Även om temporära tabeller raderas automatiskt, finns det situationer där det är en fördel att radera den manuellt. T ex om du har skrivit mycket kod och vill radera tabellen så snart du är färdig med den. Det ses också som en bra sed att de raderas när man är klar med dem.

Temporära tabeller

DROP TABLE #FavoritRecept

Globala temporära tabeller

DROP TABLE ##FavoritRecept

Tabellvariabler

Tabellvariabler liknar temporära tabeller, förutom att de är mer flexibla och de är alltid kvar i minnet. Om du har mindre än 100 rader är det lämpligt att använda tabellvariabler. Annars passar det bättre med temporära tabeller. Dessutom behöver de inte raderas när man är färdig med dem.

Skillnaden när man skapar en tabellvariabel är att man byter ut CREATE TABLE #FavoritRecept till DECLARE @FavoritRecept TABLE. Sedan använder man @ i stället när man hänvisar till den, som i INSERT INTO nedan.

DECLARE @FavoritRecept TABLE (
 FavoritRecept char(100)
 )
 INSERT INTO @FavoritRecept
 (FavoritRecept )
 SELECT
 ReceptNamn
 FROM
 Recept
 WHERE
 ReceptNamn= 'Vårrullar'

 

Kommentera

E-postadressen publiceras inte. Obligatoriska fält är märkta *