sql >> Databasteknik >  >> RDS >> Sqlserver

Introduktion till temporära tabeller i SQL Server

En temporär tabell i SQL Server, som namnet antyder, är en databastabell som finns tillfälligt på databasservern. En temporär tabell lagrar en delmängd av data från en normal tabell under en viss tidsperiod.

Tillfälliga tabeller är särskilt användbara när du har ett stort antal poster i en tabell och du upprepade gånger behöver interagera med en liten delmängd av dessa poster. I sådana fall istället för att filtrera data om och om igen för att hämta delmängden, kan du filtrera data en gång och lagra den i en tillfällig tabell. Du kan sedan köra dina frågor på den tillfälliga tabellen. Tillfälliga tabeller lagras i "tempdb" som är en systemdatabas. Låt oss ta en titt på hur du kan använda en tillfällig data i ett enkelt scenario.

Förbereder data

Låt oss först förbereda lite dummydata. Vi kommer att använda dessa data för att skapa tillfälliga tabeller.

Kör följande skript på din databasserver.

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

Ovanstående SQL-skript skapar en databas "schooldb". I den här databasen skapas en tabell som heter 'student' och en del dummydata läggs till i tabellen.

Skapa en tillfällig tabell

Det finns två metoder för att skapa tillfälliga tabeller.

Metod 1

Det enklaste sättet att skapa en temporär tabell är att använda en INTO-sats i en SELECT-fråga. Låt oss skapa en tillfällig tabell som innehåller namn, ålder och kön på alla manliga studentposter från elevtabellen.

USE schooldb;

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

Ta en titt på ovanstående fråga. Här skapade vi en tillfällig tabell "#Manliga Studenter" som lagrar namn, ålder och kön på alla manliga studentposter från studenttabellen. För att definiera en temporär tabell använder vi INTO-satsen efter SELECT-satsen. Namnet på en temporär tabell måste börja med en hash (#).

För att nu se var denna tabell finns; gå till "Objektutforskaren -> Databaser -> Systemdatabaser-> tempdb -> Tillfälliga tabeller". Du kommer att se ditt tillfälliga tabellnamn tillsammans med identifieraren. Ta en titt på följande bild:

Du måste undra över "000000000006" i slutet av tabellnamnet. Detta är en unik identifierare. Flera databasanslutningar kan skapa tillfälliga tabeller med samma namn, därför lägger databasservern automatiskt till denna unika identifierare i slutet för att skilja mellan de tillfälliga tabellerna som skapas av olika anslutningar.

Du kan utföra operationer på den temporära tabellen via samma anslutning som skapade den. Kör därför följande fråga i samma frågefönster som skapade tabellen "#Manliga Studenter".

SELECT * FROM #MaleStudents

Sedan innehåller #MaleStudents-tabellen namn, ålder och kön på alla manliga elever. Ovanstående fråga kommer att hämta följande resultat.

[tabell id=15 /]

För att skapa en ny anslutning kan du helt enkelt öppna ett nytt frågefönster i "SQL Server Management Studio". Håll nu den tidigare anslutningen öppen och skapa en annan "Manliga Studenter"-tabell med metod 2 i ett nytt frågefönster (ny anslutning).

Metod 2

Den andra metoden liknar att skapa vanliga tabeller. Ta en titt på följande fråga. Även här kommer vi att skapa #Manliga Studenter tillfälligt bord. Kom ihåg att denna fråga måste köras av en ny anslutning.

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, om du kör ovanstående fråga, bör du se två #MaleStudents temporära tabeller med olika unika identifierare inuti tempdb. Detta beror på att dessa två tabeller har skapats av två olika anslutningar. Ta en titt på följande skärmdump.

Globala tillfälliga tabeller

Det är relevant att nämna här att en temporär tabell endast är tillgänglig för den anslutning som skapade den temporära tabellen. Den är inte tillgänglig för andra anslutningar. Däremot kan vi skapa tillfälliga tabeller som är tillgängliga för alla öppna anslutningar. Sådana temporära tabeller kallas globala temporära tabeller. Namnet på den globala temporära tabellen börjar med en dubbel hash-symbol (##). Låt oss skapa en global tillfällig tabell som innehåller uppgifter om alla kvinnliga studenter från studenttabellen.

USE schooldb;

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

Nu kan du komma åt tabellen ##Female Students från vilken som helst av de öppna anslutningarna.

Ta bort en tillfällig tabell

Det finns två sätt att ta bort tillfälliga tabeller i SQL Server:Automatisk borttagning och Manuell borttagning.

Automatisk radering

En temporär tabell raderas automatiskt när anslutningen som skapade tabellen stängs. Alternativt, när du stänger frågefönstret som skapade den temporära tabellen, utan att spara ändringarna, stängs tabellen. Om en anslutning kör några frågor i den globala tabellen måste dessa frågor slutföras först innan den globala tabellen tas bort.

Manuell radering av tabell

Du kan ta bort en tabell manuellt utan att stänga en anslutning med hjälp av DROP TABLE-satsen. Kom dock ihåg att satsen måste köras av den anslutning som faktiskt skapade tabellen. Ta en titt på följande fråga:

DROP TABLE #MaleStudents

Detta liknar att ta bort en vanlig tabell.

Tillfälliga tabeller och lagrade procedurer

Tidigare fick vi veta att en temporär tabell endast kan nås lokalt i anslutningen som skapade den. Det finns ett undantag från den regeln. När du skapar lagrade procedurer kan du komma åt temporära tabeller även i andra anslutningar.

Låt oss skapa två lagrade procedurer med två olika anslutningar. Den första lagrade proceduren kommer att infoga data i #MaleStudents-tabellen, medan den andra kommer att välja data från tabellen.

Skapa en ny anslutning. Om du använder SQL Server Management Studio kan du göra det genom att öppna ett nytt frågefönster. Kör följande SQL-skript i det nya frågefönstret.

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

Vi har nu skapat en lagrad procedur som infogar en post i den temporära tabellen #MaleStudent. Lägg märke till att den här anslutningen inte skapade #MaleStudent, men vi kommer åt den genom att infoga en post i den. Detta beror på att när du skapar en lagrad procedur kan du komma åt tillfälliga tabeller från en annan anslutning än den som skapade tabellen. Om du kör ovanstående fråga kommer du att se att SQL Server inte ger något fel.

På samma sätt öppnar du en ny anslutning och skapar följande lagrade procedur i den:

CREATE PROCEDURE spListStudent
AS
BEGIN

	SELECT * FROM #MaleStudents
	ORDER BY name
END

Ovanstående lagrade procedur väljer alla poster från den temporära tabellen #MaleStudents. Även här kommer vi åt en tillfällig tabell i en anslutning som inte skapade tabellen.

Nu är här den knepiga delen. Även om du kan komma åt en temporär tabell i en annan anslutning när du skapar en lagrad procedur, kan du inte komma åt en temporär tabell när du "exekverar" en lagrad procedur i en annan anslutning. För att exekvera en lagrad procedur som får åtkomst till en temporär tabell, måste du vara inne i anslutningen som skapade den temporära tabellen.

Kör därför följande frågor i anslutningen som skapade tabellen #MaleStudents.

EXECUTE spInsertStudent Bradley, 45, Male
Execute spListStudent

Här infogar den första lagrade proceduren ett nytt studentrekord med namnet:Bradley, ålder:45 och kön:Man i #ManStudents-tabellen. Den andra lagrade proceduren väljer alla poster från tabellen #Manliga Studenter i stigande namnordning. Utdata från de lagrade procedurerna ovan kommer att vara:

[tabell id=16 /]

Du kan tydligt se vår nyinfogade post i de valda posterna ovan.

Se även:

Prestanda för tabellvariabler i SQL Server

Introduktion av vanliga tabelluttryck i SQL Server


  1. JDBC-anslutningens standardbeteende för autoCommit

  2. Snabbaste sättet att hitta avstånd mellan två lat/långa punkter

  3. Flera array_agg()-anrop i en enda fråga

  4. MySQL, Kontrollera om det finns en kolumn i en tabell med SQL