Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Einführung in temporäre Tabellen in SQL Server

Eine temporäre Tabelle in SQL Server ist, wie der Name schon sagt, eine Datenbanktabelle, die vorübergehend auf dem Datenbankserver vorhanden ist. Eine temporäre Tabelle speichert eine Teilmenge von Daten aus einer normalen Tabelle für einen bestimmten Zeitraum.

Temporäre Tabellen sind besonders nützlich, wenn Sie eine große Anzahl von Datensätzen in einer Tabelle haben und wiederholt mit einer kleinen Teilmenge dieser Datensätze interagieren müssen. Anstatt die Daten immer wieder zu filtern, um die Teilmenge abzurufen, können Sie in solchen Fällen die Daten einmal filtern und in einer temporären Tabelle speichern. Sie können dann Ihre Abfragen für diese temporäre Tabelle ausführen. Temporäre Tabellen werden in „tempdb“ gespeichert, einer Systemdatenbank. Sehen wir uns an, wie Sie temporäre Daten in einem einfachen Szenario verwenden können.

Vorbereitung der Daten

Bereiten wir zunächst einige Dummy-Daten vor. Wir werden diese Daten verwenden, um temporäre Tabellen zu erstellen.

Führen Sie das folgende Skript auf Ihrem Datenbankserver aus.

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

Das obige SQL-Skript erstellt eine Datenbank „schooldb“. In dieser Datenbank wird eine Tabelle namens „Student“ erstellt und einige Dummy-Daten in die Tabelle eingefügt.

Eine temporäre Tabelle erstellen

Es gibt zwei Methoden zum Erstellen temporärer Tabellen.

Methode 1

Die einfachste Art, eine temporäre Tabelle zu erstellen, ist die Verwendung einer INTO-Anweisung innerhalb einer SELECT-Abfrage. Lassen Sie uns eine temporäre Tabelle erstellen, die den Namen, das Alter und das Geschlecht aller männlichen Schülerdatensätze aus der Schülertabelle enthält.

USE schooldb;

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

Sehen Sie sich die obige Abfrage an. Hier haben wir eine temporäre Tabelle „#MaleStudents“ erstellt, die den Namen, das Alter und das Geschlecht aller männlichen Studentendatensätze aus der Studententabelle speichert. Um eine temporäre Tabelle zu definieren, verwenden wir die INTO-Anweisung nach der SELECT-Anweisung. Der Name einer temporären Tabelle muss mit einem Hash (#) beginnen.

Nun, um zu sehen, wo diese Tabelle existiert; Gehen Sie zu „Objekt-Explorer -> Datenbanken -> Systemdatenbanken -> tempdb -> Temporäre Tabellen“. Sie sehen Ihren temporären Tabellennamen zusammen mit der Kennung. Sehen Sie sich die folgende Abbildung an:

Sie müssen sich über das „000000000006“ am Ende des Tabellennamens wundern. Dies ist eine eindeutige Kennung. Mehrere Datenbankverbindungen können temporäre Tabellen mit demselben Namen erstellen. Um zwischen den temporären Tabellen zu unterscheiden, die von verschiedenen Verbindungen erstellt wurden, hängt der Datenbankserver daher automatisch diese eindeutige Kennung am Ende an.

Sie können Operationen an der temporären Tabelle über dieselbe Verbindung ausführen, über die sie erstellt wurde. Führen Sie daher in demselben Abfragefenster, in dem die Tabelle „#MaleStudents“ erstellt wurde, die folgende Abfrage aus.

SELECT * FROM #MaleStudents

Seitdem enthält die Tabelle #MaleStudents den Namen, das Alter und das Geschlecht aller männlichen Studenten. Die obige Abfrage wird folgende Ergebnisse abrufen.

[Tabellen-ID=15 /]

Um eine neue Verbindung zu erstellen, können Sie einfach ein neues Abfragefenster im „SQL Server Management Studio“ öffnen. Lassen Sie nun die vorherige Verbindung geöffnet und erstellen Sie in einem neuen Abfragefenster (neue Verbindung) eine weitere Tabelle „MaleStudents“ mit Methode 2.

Methode 2

Die zweite Methode ähnelt der Erstellung normaler Tabellen. Sehen Sie sich die folgende Abfrage an. Auch hier erstellen wir die temporäre Tabelle #MaleStudents. Denken Sie daran, dass diese Abfrage von einer neuen Verbindung ausgeführt werden muss.

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'

Wenn Sie nun die obige Abfrage ausführen, sollten Sie zwei temporäre #MaleStudents-Tabellen mit unterschiedlichen eindeutigen Bezeichnern in der tempdb sehen. Dies liegt daran, dass diese beiden Tabellen von zwei verschiedenen Verbindungen erstellt wurden. Sehen Sie sich den folgenden Screenshot an.

Globale temporäre Tabellen

Es ist wichtig, hier zu erwähnen, dass eine temporäre Tabelle nur für die Verbindung zugänglich ist, die diese temporäre Tabelle erstellt hat. Es ist für andere Verbindungen nicht zugänglich. Wir können jedoch temporäre Tabellen erstellen, auf die alle offenen Verbindungen zugreifen können. Solche temporären Tabellen werden als globale temporäre Tabellen bezeichnet. Der Name der globalen temporären Tabelle beginnt mit einem Doppelkreuz (##). Lassen Sie uns eine globale temporäre Tabelle erstellen, die Datensätze aller Studentinnen aus der student-Tabelle enthält.

USE schooldb;

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

Jetzt können Sie von allen geöffneten Verbindungen aus auf die Tabelle ##FemaleStudents zugreifen.

Löschen einer temporären Tabelle

Es gibt zwei Möglichkeiten, temporäre Tabellen in SQL Server zu löschen:Automatisches Löschen und manuelles Löschen.

Automatische Löschung

Eine temporäre Tabelle wird automatisch gelöscht, wenn die Verbindung, die die Tabelle erstellt hat, geschlossen wird. Wenn Sie alternativ das Abfragefenster schließen, das die temporäre Tabelle erstellt hat, ohne die Änderungen zu speichern, wird die Tabelle geschlossen. Wenn eine Verbindung einige Abfragen auf der globalen Tabelle ausführt, müssen diese Abfragen zuerst abgeschlossen werden, bevor die globale Tabelle gelöscht wird.

Manuelle Tabellenlöschung

Mit der DROP TABLE-Anweisung können Sie eine Tabelle manuell löschen, ohne eine Verbindung zu schließen. Denken Sie jedoch daran, dass die Anweisung von der Verbindung ausgeführt werden muss, die die Tabelle tatsächlich erstellt hat. Sehen Sie sich die folgende Abfrage an:

DROP TABLE #MaleStudents

Dies ähnelt dem Löschen einer normalen Tabelle.

Temporäre Tabellen und gespeicherte Prozeduren

Zuvor haben wir gelernt, dass auf eine temporäre Tabelle nur lokal innerhalb der Verbindung zugegriffen werden kann, die sie erstellt hat. Es gibt eine Ausnahme von dieser Regel. Wenn Sie gespeicherte Prozeduren erstellen, können Sie auch in anderen Verbindungen auf temporäre Tabellen zugreifen.

Lassen Sie uns zwei gespeicherte Prozeduren mit zwei verschiedenen Verbindungen erstellen. Die erste gespeicherte Prozedur fügt Daten in die Tabelle #MaleStudents ein, während die zweite die Daten aus der Tabelle auswählt.

Erstellen Sie eine neue Verbindung. Wenn Sie SQL Server Management Studio verwenden, können Sie dazu ein neues Abfragefenster öffnen. Führen Sie das folgende SQL-Skript im neuen Abfragefenster aus.

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

Wir haben jetzt eine gespeicherte Prozedur erstellt, die einen Datensatz in die temporäre Tabelle #MaleStudent einfügt. Beachten Sie, dass diese Verbindung #MaleStudent nicht erstellt hat, aber wir greifen darauf zu, indem wir einen Datensatz darin einfügen. Dies liegt daran, dass Sie beim Erstellen einer gespeicherten Prozedur über eine andere Verbindung als diejenige, die die Tabelle erstellt hat, auf temporäre Tabellen zugreifen können. Wenn Sie die obige Abfrage ausführen, werden Sie sehen, dass SQL Server keinen Fehler ausgibt.

Öffnen Sie auf ähnliche Weise eine neue Verbindung und erstellen Sie darin die folgende gespeicherte Prozedur:

CREATE PROCEDURE spListStudent
AS
BEGIN

	SELECT * FROM #MaleStudents
	ORDER BY name
END

Die obige gespeicherte Prozedur wählt alle Datensätze aus der temporären Tabelle #MaleStudents aus. Auch hier greifen wir auf eine temporäre Tabelle innerhalb einer Verbindung zu, die die Tabelle nicht erstellt hat.

Jetzt ist hier der knifflige Teil. Obwohl Sie beim Erstellen einer gespeicherten Prozedur auf eine temporäre Tabelle innerhalb einer anderen Verbindung zugreifen können, können Sie nicht auf eine temporäre Tabelle zugreifen, wenn Sie eine gespeicherte Prozedur innerhalb einer anderen Verbindung „ausführen“. Um eine gespeicherte Prozedur auszuführen, die auf eine temporäre Tabelle zugreift, müssen Sie sich in der Verbindung befinden, die die temporäre Tabelle erstellt hat.

Führen Sie daher die folgenden Abfragen innerhalb der Verbindung aus, die die Tabelle #MaleStudents erstellt hat.

EXECUTE spInsertStudent Bradley, 45, Male
Execute spListStudent

Hier fügt die erste gespeicherte Prozedur einen neuen Schülerdatensatz mit dem Namen:Bradley, Alter:45 und Geschlecht:Männlich in die Tabelle #MaleStudents ein. Die zweite gespeicherte Prozedur wählt alle Datensätze aus der Tabelle #MaleStudents in aufsteigender Reihenfolge der Namen aus. Die Ausgabe der obigen gespeicherten Prozeduren lautet:

[Tabellen-ID=16 /]

Sie können unseren neu eingefügten Datensatz in den ausgewählten Datensätzen oben deutlich sehen.

Siehe auch:

Leistung von Tabellenvariablen in SQL Server

Einführung allgemeiner Tabellenausdrücke in SQL Server