Dočasná tabulka v SQL Server, jak název napovídá, je databázová tabulka, která dočasně existuje na databázovém serveru. Dočasná tabulka ukládá po určitou dobu podmnožinu dat z normální tabulky.
Dočasné tabulky jsou užitečné zejména tehdy, když máte v tabulce velký počet záznamů a opakovaně potřebujete pracovat s malou podmnožinou těchto záznamů. V takových případech můžete místo opakovaného filtrování dat za účelem načtení podmnožiny filtrovat data jednou a uložit je do dočasné tabulky. Poté můžete provádět své dotazy na této dočasné tabulce. Dočasné tabulky jsou uloženy v „tempdb“, což je systémová databáze. Pojďme se podívat na to, jak můžete použít dočasná data v jednoduchém scénáři.
Příprava dat
Nejprve si připravíme nějaká falešná data. Tato data použijeme k vytvoření dočasných tabulek.
Spusťte na svém databázovém serveru následující skript.
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);
Výše uvedený SQL skript vytvoří databázi ‚schooldb‘. V této databázi se vytvoří tabulka nazvaná ‚student‘ a do tabulky se přidají nějaká fiktivní data.
Vytvoření dočasné tabulky
Existují dva způsoby vytváření dočasných tabulek.
Metoda 1
Nejjednodušším způsobem vytvoření dočasné tabulky je použití příkazu INTO v rámci dotazu SELECT. Vytvořme dočasnou tabulku, která bude obsahovat jméno, věk a pohlaví všech mužských studentských záznamů ze studentské tabulky.
USE schooldb; SELECT name, age, gender INTO #MaleStudents FROM student WHERE gender = 'Male'
Podívejte se na výše uvedený dotaz. Zde jsme vytvořili dočasnou tabulku „#MaleStudents“, která ukládá jména, věk a pohlaví všech záznamů mužských studentů ze studentské tabulky. K definování dočasné tabulky používáme za příkazem SELECT příkaz INTO. Název dočasné tabulky musí začínat znakem hash (#).
Nyní, abychom viděli, kde tato tabulka existuje; přejděte na „Průzkumník objektů -> Databáze -> Systémové databáze-> tempdb -> Dočasné tabulky“. Uvidíte svůj dočasný název tabulky spolu s identifikátorem. Podívejte se na následující obrázek:
Určitě vás zajímá „000000000006“ na konci názvu tabulky. Toto je jedinečný identifikátor. Více databázových připojení může vytvořit dočasné tabulky se stejným názvem, proto pro rozlišení mezi dočasnými tabulkami vytvořenými různými připojeními databázový server automaticky připojí tento jedinečný identifikátor na konec.
Operace s dočasnou tabulkou můžete provádět prostřednictvím stejného připojení, které ji vytvořilo. Proto ve stejném okně dotazu, které vytvořilo tabulku „#MaleStudents“, proveďte následující dotaz.
SELECT * FROM #MaleStudents
Tabulka #MaleStudents obsahuje jména, věk a pohlaví všech studentů mužského pohlaví. Výše uvedený dotaz načte následující výsledky.
[id tabulky=15 /]
Chcete-li vytvořit nové připojení, můžete jednoduše otevřít nové okno dotazu v „SQL Server Management Studio“. Nyní ponechte předchozí připojení otevřené a vytvořte další tabulku „MaleStudents“ pomocí metody 2 v okně nového dotazu (nové připojení).
Metoda 2
Druhá metoda je podobná vytváření normálních tabulek. Podívejte se na následující dotaz. Zde opět vytvoříme dočasnou tabulku #MaleStudents. Pamatujte, že tento dotaz musí být proveden novým připojením.
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'
Nyní, pokud provedete výše uvedený dotaz, měli byste v databázi tempdb vidět dvě dočasné tabulky #MaleStudents s různými jedinečnými identifikátory. Je to proto, že tyto dvě tabulky byly vytvořeny dvěma různými připojeními. Podívejte se na následující snímek obrazovky.
Globální dočasné tabulky
Zde je vhodné zmínit, že dočasná tabulka je přístupná pouze pro připojení, které tuto dočasnou tabulku vytvořilo. Není přístupný pro ostatní připojení. Můžeme však vytvořit dočasné tabulky, které jsou přístupné všem otevřeným připojením. Takové dočasné tabulky se nazývají globální dočasné tabulky. Název globální dočasné tabulky začíná dvojitým křížkem (##). Vytvořme globální dočasnou tabulku, která bude obsahovat záznamy všech studentek ze studentské tabulky.
USE schooldb; SELECT name, age, gender INTO ##FemaleStudents FROM student WHERE gender = 'Female'
Nyní máte přístup k tabulce ##FemaleStudents z libovolného otevřeného připojení.
Odstranění dočasné tabulky
Existují dva způsoby, jak odstranit dočasné tabulky v SQL Server:Automatické odstranění a ruční odstranění.
Automatické mazání
Dočasná tabulka se automaticky odstraní, když se zavře připojení, které tabulku vytvořilo. Případně, když zavřete okno dotazu, které vytvořilo dočasnou tabulku, bez uložení změn bude tabulka uzavřena. Pokud připojení provádí nějaké dotazy na globální tabulce, musí být tyto dotazy nejprve dokončeny, než bude globální tabulka odstraněna.
Ruční smazání tabulky
Tabulku můžete ručně odstranit bez uzavření připojení pomocí příkazu DROP TABLE. Pamatujte však, že příkaz musí být proveden připojením, které skutečně vytvořilo tabulku. Podívejte se na následující dotaz:
DROP TABLE #MaleStudents
Je to podobné jako smazání normální tabulky.
Dočasné tabulky a uložené procedury
Dříve jsme se dozvěděli, že k dočasné tabulce lze přistupovat pouze lokálně v rámci připojení, které ji vytvořilo. Z tohoto pravidla existuje jedna výjimka. Když vytváříte uložené procedury, můžete přistupovat k dočasným tabulkám i v jiných připojeních.
Vytvořme dvě uložené procedury pomocí dvou různých připojení. První uložená procedura vloží data do tabulky #MaleStudents, zatímco druhá vybere data z tabulky.
Vytvořte nové připojení. Pokud používáte SQL Server Management Studio, můžete tak učinit otevřením nového okna dotazu. Spusťte následující skript SQL v okně nového dotazu.
Create Procedure spInsertStudent (@Name Varchar(50), @Age int, @Gender Varchar(50)) As Begin Insert Into #MaleStudents Values (@Name, @Age, @Gender) End
Nyní jsme vytvořili uloženou proceduru, která vloží záznam do dočasné tabulky #MaleStudent. Všimněte si, že toto připojení nevytvořilo #MaleStudent, ale my k němu přistupujeme tak, že do něj vložíme záznam. Důvodem je, že při vytváření uložené procedury můžete přistupovat k dočasným tabulkám z jiného připojení, než je to, které vytvořilo tabulku. Pokud provedete výše uvedený dotaz, uvidíte, že SQL Server nevyvolá žádnou chybu.
Podobně otevřete nové připojení a vytvořte v něm následující uloženou proceduru:
CREATE PROCEDURE spListStudent AS BEGIN SELECT * FROM #MaleStudents ORDER BY name END
Výše uvedená uložená procedura vybere všechny záznamy z dočasné tabulky #MaleStudents. Zde opět přistupujeme k dočasné tabulce uvnitř připojení, které nevytvořilo tabulku.
Teď je tu ta záludná část. Přestože při vytváření uložené procedury můžete přistupovat k dočasné tabulce uvnitř jiného připojení, nemůžete přistupovat k dočasné tabulce při „provádění“ uložené procedury v jiném připojení. Chcete-li provést uloženou proceduru, která přistupuje k dočasné tabulce, musíte být uvnitř připojení, které vytvořilo dočasnou tabulku.
Proto proveďte následující dotazy uvnitř připojení, které vytvořilo tabulku #MaleStudents.
EXECUTE spInsertStudent Bradley, 45, Male Execute spListStudent
Zde první uložená procedura vloží nový záznam studenta se jménem:Bradley, age:45 a gender:Male do tabulky #MaleStudents. Druhá uložená procedura vybere všechny záznamy z tabulky #MaleStudents ve vzestupném pořadí názvu. Výstup výše uložených procedur bude:
[id tabulky=16 /]
Náš nově vložený záznam můžete jasně vidět ve vybraných záznamech výše.
Viz také:
Výkon tabulkových proměnných v SQL Server
Představujeme běžné tabulkové výrazy v SQL Server