Tento článek nabízí pět možností pro kontrolu, zda tabulka na serveru SQL Server existuje. Většina možností zahrnuje dotaz na systémový pohled, ale jedna z možností provede systémovou uloženou proceduru a další zahrnuje funkci.
Zahrnuji také několik jednoduchých IF
prohlášení, která lze upravit tak, aby vyhovovaly vašim okolnostem.
Možnost 1 – Zobrazení sys.tables
Tato volba se dotazuje na sys.tables
zobrazení katalogu systému. Toto zobrazení vrátí řádek pro každou uživatelskou tabulku. Proto se můžete dotázat pomocí názvu tabulky, který hledáte.
Příklad:
SELECT object_id FROM sys.tables WHERE name = 'Artists';
Výsledek:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Můžete také přidat název schématu k věcem, které kontrolujete. Zde je návod, jak upravit předchozí dotaz tak, aby obsahoval název schématu:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Výsledek:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Všimněte si, že sys.tables
view vrací pouze ID schématu, takže jsem to musel předat do SCHEMA_NAME()
funkce, aby získal její jméno. Případně bych mohl použít ID schématu, kdybych to věděl.
Příklad:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND schema_id = 1;
Výsledek:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Možnost 2 – Uložená procedura sp_tables
Další možnost spustí sp_tables
uložené procedury.
Zde je návod, jak stručný může být váš kód při použití této metody:
sp_tables 'Artists'
Výsledek:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Tato uložená procedura však vrací pohledy i tabulky, takže je dobré ji zúžit pouze na tabulky (pokud nemáte zájem o vracení pohledů). Chcete-li to zúžit pouze na tabulky, použijte @table_type = "'TABLE'"
.
Když už jste u toho, můžete také určit vlastníka tabulky a kvalifikátor tabulky.
Příklad:
EXEC sp_tables @table_name = 'Artists', @table_owner = 'dbo', @table_qualifier = 'Music', @table_type = "'TABLE'", @fUsePattern = 1;
Výsledek:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Je důležité si uvědomit, že @table_type
parametr přijímá čárkami oddělený seznam. Proto se trochu liší od ostatních parametrů. @table_type
hodnota musí být uzavřena do dvojitých uvozovek a každá položka do jednoduchých uvozovek. V mém příkladu je pouze jedna položka seznamu, ale stále je třeba ji uzavřít do dvojitých i jednoduchých uvozovek.
Možnost 3 – INFORMATION_SCHEMA.TABLES
INFORMATION_SCHEMA.TABLES
systémový pohled vrátí jeden řádek pro každou tabulku nebo pohled v aktuální databázi, pro kterou má aktuální uživatel oprávnění. Je to podobné jako sys.tables
, ale vrátí méně sloupců. Zobrazení informačního schématu zahrnutá v SQL Serveru vyhovují definici normy ISO pro INFORMATION_SCHEMA.
Zde je příklad použití ke kontrole, zda tabulka v aktuální databázi existuje:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists';
Výsledek:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
Tady je to znovu, ale tentokrát uvedu i schéma:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists' AND TABLE_SCHEMA = 'dbo';
Výsledek:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
Možnost 4 – Funkce OBJECT_ID()
Můžete také použít funkci jako OBJECT_ID()
abyste zjistili, zda vrací hodnotu jinou než NULL.
Příklad:
SELECT OBJECT_ID('Artists', 'U') AS Result;
Výsledek:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
V tomto případě tabulka existuje. Všimněte si, že jsem použil U
k označení typu objektu (uživatelem definovaná tabulka).
Můžete také zadat název ze tří částí, který bude obsahovat databázi a schéma:
SELECT OBJECT_ID('Music.dbo.Artists', 'U') AS Result;
Výsledek:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
Pokud tabulka neexistuje, dostanete NULL
:
SELECT OBJECT_ID('Oops!', 'U') AS Result;
Výsledek:
+----------+ | Result | |----------| | NULL | +----------+
Níže je uveden příklad použití v IF
prohlášení.
Možnost 5 – Zobrazení sys.objects
Jako by žádný z předchozích příkladů nefungoval, je zde další způsob, jak zkontrolovat, zda tabulka existuje.
Tentokrát se dotazuji na sys.objects
zobrazení katalogu systému. Toto zobrazení vrátí řádek pro každý uživatelsky definovaný objekt v databázi v rozsahu schématu. Nevrací pouze tabulky, vrací všechny druhy objektů. Proto jej musíme zúžit pouze na tabulky. V tomto případě mě zajímají pouze uživatelsky definované tabulky, takže mohu použít type = 'U'
(U
je pro „USER_TABLE“). Případně můžete použít TYPE_DESC = 'USER_TABLE'
.
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists';
Výsledek:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Tady je to znovu, ale s uvedením schématu:
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Výsledek:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Možnost 6 – Zobrazení sys.sysobjects (VYHNOUT SE)
Tato možnost je uvedena pouze proto, že ji mohu doporučit nepoužívat. Soubor sys.sysobjects
zobrazení je součástí serveru SQL Server kvůli zpětné kompatibilitě a společnost Microsoft doporučuje, abyste se v budoucí práci vyvarovali používání tohoto zobrazení.
Pokud narazíte na kód, který používá toto zobrazení, zvažte jeho úpravu tak, aby používal sys.objects
nebo nějaký jiný systémový pohled nebo uložená procedura.
V každém případě zde je, jak by mohl vypadat předchozí příklad, pokud použijete sys.sysobjects
místo sys.objects
.
SELECT id FROM sys.sysobjects WHERE xtype = 'U' AND name = 'Artists';
Výsledek:
+-----------+ | id | |-----------| | 885578193 | +-----------+
Příkaz IF 1
Zde je jednoduchý IF
příkaz, který zkontroluje existenci tabulky, poté vytiskne jinou zprávu v závislosti na výsledku. Tento kód lze upravit tak, aby vyhovoval vašim konkrétním potřebám.
IF EXISTS (SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo') PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Výsledek:
The table exists
A takhle to vypadá, když tabulka neexistuje:
IF EXISTS (SELECT object_id FROM sys.tables WHERE name = 'Customer' AND SCHEMA_NAME(schema_id) = 'dbo') PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Výsledek:
The table does not exist
Příkaz IF 2
Zde je další IF
prohlášení, které lze upravit tak, aby vyhovovalo vašim konkrétním potřebám.
IF OBJECT_ID('Artists', 'U') IS NOT NULL PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Výsledek:
The table exists