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.