Przejdź do treści
FullstackDev

Tabele tymczasowe

Pisząc róźnego rodzaju skrypty w SQL, czasem zdaży się, że potrzebujemy stworzyć tabelę tymczasową, która będzie przechowywać dane tymczasowo, podobnie jak robiły to zmienne zdefiniowane jako: DECLARE @Zmienna <typ> = <wartość>, z tym, że tabela tymczasowana jest w stanie przechowywać wiele wierszy, dla wielu kolumn jednocześnie.

W SQL Server mamy do dyspozycji dwie opcje tworzenia tabel tymczasowych: #Tabela oraz ##Tabela.

#Tabela jest tworzona w ramach sesji, co oznacza, że jest dostępna tylko dla sesji, w której została utworzona. Po zakończeniu sesji, tabela zostanie usunięta.

##Tabela jest tworzona w ramach serwera, co oznacza, że jest dostępna dla wszystkich sesji, które są połączone z serwerem. Po zakończeniu sesji, tabela nie zostanie usunięta, dopóki nie zostanie usunięta ręcznie.

Zazwyczaj nie będziemy mieli potrzeby definiowania tabeli tymczasowej globalnej, dlatego w poniższych przykładach będziemy korzystać z tabeli tymczasowej sesyjnej.

Tworzenie tabeli tymczasowej

Tabele tymczasowe tworzymy za pomocą polecenia CREATE TABLE z dodatkowym znakiem # lub ## przed nazwą tabeli.

CREATE TABLE #Tabela (
    Kolumna1 INT,
    Kolumna2 VARCHAR(50)
);

Wstawianie danych do tabeli tymczasowej

Dane wstawiamy do tabeli tymczasowej za pomocą polecenia INSERT INTO.

INSERT INTO #Tabela (Kolumna1, Kolumna2)
VALUES (1, 'Wiersz 1'),
       (2, 'Wiersz 2'),
       (3, 'Wiersz 3');

SELECT INTO

Możemy również skorzystać z polecenia SELECT INTO, które pozwala na stworzenie tabeli tymczasowej na podstawie wyniku zapytania SELECT.

SELECT *
INTO #Tabela
FROM InnaTabela;

Przykład

Załóżmy, że mamy liste państw, dla których chcielibyśmy wyczyścić wszystkie informacje o użytkownikach z danych państw. W tym celu możemy stworzyć tabelę tymczasową, która będzie przechowywać listę państw, dla których chcemy wyczyścić dane - jako, że zwykła zmienna nie jest w stanie przechowywać wielu wartości jednocześnie.

CREATE TABLE #CountriesToClean (
    Country VARCHAR(50)
);
INSERT INTO #CountriesToClean (Country)
VALUES ('Japan'),
       ('Germany'),
       ('France'),
       ('Italy'),
       ('Australia');

-- wyświetlenie zawartości tabeli tymczasowej
SELECT * FROM #CountriesToClean;

Bazując na tej tabeli tymczasowiej, możemy ją teraz wykorzystać do usunięcia informacji o użytkownikach z tych państw.

BEGIN TRAN
CREATE TABLE #CountriesToClean (
    Country VARCHAR(50)
);
INSERT INTO #CountriesToClean (Country)
VALUES ('Japan'),
       ('Germany'),
       ('France'),
       ('Italy'),
       ('Australia');

-- wyświetlenie zawartości tabeli tymczasowej
SELECT * FROM #CountriesToClean;

-- usunięcie informacji o wypożyczeniach
DELETE l
FROM Loans l
JOIN Users u on u.UserId = l.UserId
JOIN Addresses a on a.AddressId = u.AddressId
WHERE a.Country IN (SELECT Country FROM #CountriesToClean)

-- usunięcie użytkowników
DELETE u
FROM Users u
JOIN Addresses a on a.AddressId = u.AddressId
WHERE a.Country IN (SELECT Country FROM #CountriesToClean)

-- usunięcie adresów
DELETE 
FROM Addresses 
WHERE Country IN (SELECT Country FROM #CountriesToClean)
ROLLBACK TRAN

W ten prosty sposób, tworząc tabele tymczasowe, możemy przechowywać wiele wartości w 'jednym miejscu', a następnie wykonywać na nich róźne operacje.