T-SQL nezahrnuje IF NOT EXISTS
klauzule s její CREATE TABLE
jako některé jiné DBMS.
Pokud tedy chceme ověřit existenci tabulky předtím, než ji vytvoříme v SQL Serveru, musíme použít jiné metody.
Možnost 1:Zkontrolujte ID objektu
V SQL Server můžeme použít OBJECT_ID()
funkce pro kontrolu existence tabulky, než se ji pokusíme vytvořit:
IF OBJECT_ID(N'dbo.t1', N'U') IS NULL
CREATE TABLE dbo.t1 (
c1 int,
c2 varchar(10)
);
GO
Výše uvedený příklad kontroluje ID objektu pro dbo.t1
tabulka.
Druhý argument pro OBJECT_ID()
určuje typ objektu, který hledáme. V tomto případě používáme U
, což je pro „uživatelem definovanou tabulku“.
OBJECT_ID()
vrátí identifikační číslo databázového objektu objektu v rozsahu schématu. Pokud objekt neexistuje nebo k němu nemáte přístup, funkce vrátí hodnotu NULL. Proto můžeme zkontrolovat hodnotu NULL a vytvořit tabulku pouze v případě, že tato funkce vrátí hodnotu NULL.
Můžeme použít OBJECT_ID()
funkce pro kontrolu ID objektu tabulky po jejím vytvoření:
SELECT OBJECT_ID(N'dbo.t1', N'U');
Příklad výsledku:
354100302
Pokud bychom chtěli trochu více informací, mohli bychom udělat něco takového:
sp_tables 't1';
Výsledek:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | KrankyKranes | dbo | t1 | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Zde KrankyKranes
je databáze, ve které jsem vytvořil tabulku.
Existuje mnoho dalších způsobů, jak se podívat na existující tabulky. Příklady viz 6 způsobů, jak zkontrolovat, zda existuje tabulka na serveru SQL.
Možnost 2:Dotaz na sys.tables
Dalším způsobem, jak zkontrolovat, zda tabulka již existuje, je dotaz na sys.tables
zobrazení systémového katalogu.
Příklad:
IF NOT EXISTS (
SELECT * FROM sys.tables t
JOIN sys.schemas s ON (t.schema_id = s.schema_id)
WHERE s.name = 'dbo' AND t.name = 't1')
CREATE TABLE dbo.t1 (
c1 int,
c2 varchar(10)
);
To dělá podobnou věc jako předchozí příklad; zkontroluje existenci tabulky a vytvoří ji pouze v případě, že neexistuje.
Bez ohledu na metodu použitou ke kontrole existence tabulky se příkaz dokončí úspěšně, bez ohledu na to, zda tabulka existuje nebo ne.
Z obou metod tedy získáme následující výstup:
Commands completed successfully.
Dostávám tuto zprávu, zda tabulka již existovala nebo ne.
Pokud tabulka již existuje, ale nezkontrolujeme existenci tabulky, zobrazí se tato chyba:
Msg 2714, Level 16, State 6, Line 1 There is already an object named 't1' in the database.
Je důležité si uvědomit, že to, že tabulka s tímto názvem již v databázi existuje, neznamená, že má správnou definici. Výše uvedené metody jednoduše zkontrolují tabulku podle názvu a schématu.