Tabela tymczasowa w SQL Server, jak sama nazwa wskazuje, to tabela bazy danych, która tymczasowo istnieje na serwerze bazy danych. Tabela tymczasowa przechowuje podzbiór danych z normalnej tabeli przez określony czas.
Tabele tymczasowe są szczególnie przydatne, gdy w tabeli znajduje się duża liczba rekordów i często zachodzi potrzeba interakcji z małym podzbiorem tych rekordów. W takich przypadkach zamiast filtrować dane raz po raz w celu pobrania podzbioru, można raz filtrować dane i przechowywać je w tabeli tymczasowej. Następnie możesz wykonać swoje zapytania w tej tabeli tymczasowej. Tabele tymczasowe są przechowywane w „tempdb”, czyli systemowej bazie danych. Przyjrzyjmy się, jak możesz użyć danych tymczasowych w prostym scenariuszu.
Przygotowywanie danych
Przygotujmy najpierw kilka fikcyjnych danych. Wykorzystamy te dane do tworzenia tabel tymczasowych.
Uruchom następujący skrypt na serwerze bazy danych.
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);
Powyższy skrypt SQL tworzy bazę danych „schooldb”. W tej bazie danych tworzona jest tabela o nazwie „uczeń” i do niej dodawane są pewne fikcyjne dane.
Tworzenie tymczasowej tabeli
Istnieją dwie metody tworzenia tabel tymczasowych.
Metoda 1
Najprostszym sposobem utworzenia tabeli tymczasowej jest użycie instrukcji INTO w zapytaniu SELECT. Utwórzmy tymczasową tabelę zawierającą imię i nazwisko, wiek i płeć wszystkich rekordów uczniów płci męskiej z tabeli uczniów.
USE schooldb; SELECT name, age, gender INTO #MaleStudents FROM student WHERE gender = 'Male'
Spójrz na powyższe zapytanie. Tutaj utworzyliśmy tymczasową tabelę „#MaleStudents”, która przechowuje imię i nazwisko, wiek i płeć wszystkich rekordów uczniów płci męskiej z tabeli uczniów. Aby zdefiniować tabelę tymczasową, używamy instrukcji INTO po instrukcji SELECT. Nazwa tabeli tymczasowej musi zaczynać się od skrótu (#).
Teraz, aby zobaczyć, gdzie istnieje ten stół; przejdź do „Object Explorer -> Databases -> System Databases -> tempdb -> Temporary Tables”. Zobaczysz nazwę tymczasowej tabeli wraz z identyfikatorem. Spójrz na następujący rysunek:
Pewnie zastanawiasz się nad „0000000000006” na końcu nazwy tabeli. To jest unikalny identyfikator. Wiele połączeń z bazą danych może tworzyć tymczasowe tabele o tej samej nazwie, dlatego aby odróżnić tymczasowe tabele utworzone przez różne połączenia, serwer bazy danych automatycznie dołącza ten unikalny identyfikator na końcu.
Możesz wykonywać operacje na tabeli tymczasowej za pośrednictwem tego samego połączenia, które ją utworzyło. Dlatego w tym samym oknie zapytania, które utworzyło tabelę „#MaleStudents”, wykonaj następujące zapytanie.
SELECT * FROM #MaleStudents
Ponieważ tabela #MaleStudents zawiera imię i nazwisko, wiek i płeć wszystkich studentów płci męskiej. Powyższe zapytanie spowoduje pobranie następujących wyników.
[identyfikator tabeli=15 /]
Aby utworzyć nowe połączenie, wystarczy otworzyć nowe okno zapytania w „SQL Server Management Studio”. Teraz pozostaw poprzednie połączenie otwarte i utwórz kolejną tabelę „MaleStudents” za pomocą metody 2 w nowym oknie zapytania (nowe połączenie).
Metoda 2
Druga metoda jest podobna do tworzenia normalnych tabel. Spójrz na następujące zapytanie. Tutaj ponownie stworzymy tabelę tymczasową #MaleStudents. Pamiętaj, że to zapytanie musi zostać wykonane przez nowe połączenie.
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'
Teraz, jeśli wykonasz powyższe zapytanie, powinieneś zobaczyć dwie tymczasowe tabele #MaleStudents z różnymi unikalnymi identyfikatorami w tempdb. Dzieje się tak, ponieważ te dwie tabele zostały utworzone przez dwa różne połączenia. Spójrz na poniższy zrzut ekranu.
Globalne tabele tymczasowe
Należy tutaj wspomnieć, że tabela tymczasowa jest dostępna tylko dla połączenia, które utworzyło tę tabelę tymczasową. Nie jest dostępny dla innych połączeń. Możemy jednak tworzyć tabele tymczasowe, które są dostępne dla wszystkich otwartych połączeń. Takie tabele tymczasowe nazywane są globalnymi tabelami tymczasowymi. Nazwa globalnej tabeli tymczasowej zaczyna się od podwójnego symbolu hash (##). Utwórzmy globalną tabelę tymczasową zawierającą rekordy wszystkich uczennic z tabeli uczniów.
USE schooldb; SELECT name, age, gender INTO ##FemaleStudents FROM student WHERE gender = 'Female'
Teraz możesz uzyskać dostęp do tabeli ##FemaleStudents z dowolnego otwartego połączenia.
Usuwanie tabeli tymczasowej
Istnieją dwa sposoby usuwania tymczasowych tabel w SQL Server:automatyczne usuwanie i ręczne usuwanie.
Automatyczne usuwanie
Tabela tymczasowa jest automatycznie usuwana po zamknięciu połączenia, które utworzyło tabelę. Alternatywnie, po zamknięciu okna zapytania, które utworzyło tabelę tymczasową, bez zapisania zmian tabela zostanie zamknięta. Jeśli połączenie wykonuje jakieś zapytania w globalnej tabeli, te zapytania muszą zostać zakończone przed usunięciem globalnej tabeli.
Ręczne usuwanie tabeli
Możesz ręcznie usunąć tabelę bez zamykania połączenia za pomocą instrukcji DROP TABLE. Pamiętaj jednak, że instrukcja musi zostać wykonana przez połączenie, które faktycznie utworzyło tabelę. Spójrz na następujące zapytanie:
DROP TABLE #MaleStudents
Jest to podobne do usuwania normalnej tabeli.
Tymczasowe tabele i procedury składowane
Wcześniej dowiedzieliśmy się, że dostęp do tabeli tymczasowej można uzyskać tylko lokalnie w połączeniu, które ją utworzyło. Od tej reguły jest jeden wyjątek. Podczas tworzenia procedur składowanych możesz uzyskać dostęp do tabel tymczasowych również w innych połączeniach.
Utwórzmy dwie procedury składowane przy użyciu dwóch różnych połączeń. Pierwsza procedura składowana wstawi dane do tabeli #MaleStudents, podczas gdy druga wybierze dane z tabeli.
Utwórz nowe połączenie. Jeśli używasz programu SQL Server Management Studio, możesz to zrobić, otwierając nowe okno zapytania. Wykonaj następujący skrypt SQL w nowym oknie zapytania.
Create Procedure spInsertStudent (@Name Varchar(50), @Age int, @Gender Varchar(50)) As Begin Insert Into #MaleStudents Values (@Name, @Age, @Gender) End
Stworzyliśmy teraz procedurę składowaną, która wstawia rekord do tabeli tymczasowej #MaleStudent. Zauważ, że to połączenie nie stworzyło #MaleStudent, ale uzyskujemy do niego dostęp poprzez wstawienie do niego rekordu. Dzieje się tak, ponieważ podczas tworzenia procedury składowanej można uzyskać dostęp do tabel tymczasowych z połączenia innego niż to, które utworzyło tabelę. Jeśli wykonasz powyższe zapytanie, zobaczysz, że SQL Server nie zgłosi żadnego błędu.
Podobnie otwórz nowe połączenie i utwórz w nim następującą procedurę składowaną:
CREATE PROCEDURE spListStudent AS BEGIN SELECT * FROM #MaleStudents ORDER BY name END
Powyższa procedura składowana wybiera wszystkie rekordy z tabeli tymczasowej #MaleStudents. Tutaj znowu mamy dostęp do tymczasowej tabeli wewnątrz połączenia, które nie utworzyło tabeli.
Teraz jest trudna część. Chociaż możesz uzyskać dostęp do tabeli tymczasowej w innym połączeniu podczas tworzenia procedury składowanej, nie możesz uzyskać dostępu do tabeli tymczasowej podczas „wykonywania” procedury składowanej w innym połączeniu. Aby wykonać procedurę składowaną, która uzyskuje dostęp do tabeli tymczasowej, musisz znajdować się w połączeniu, które utworzyło tabelę tymczasową.
Dlatego wykonaj następujące zapytania wewnątrz połączenia, które utworzyło tabelę #MaleStudents.
EXECUTE spInsertStudent Bradley, 45, Male Execute spListStudent
Tutaj pierwsza procedura składowana wstawia nowy rekord ucznia o nazwie:Bradley, wiek:45 i płeć:Mężczyzna do tabeli #MaleStudents. Druga procedura składowana wybiera wszystkie rekordy z tabeli #MaleStudents w kolejności rosnącej nazwy. Wynikiem powyższych procedur składowanych będzie:
[identyfikator tabeli=16 /]
Możesz wyraźnie zobaczyć nasz nowo wstawiony rekord w wybranych rekordach powyżej.
Zobacz też:
Wydajność zmiennych tabel w SQL Server
Przedstawiamy wspólne wyrażenia tabelowe w SQL Server