sql >> Databáze >  >> RDS >> Sqlserver

6 způsobů, jak zkontrolovat, zda existuje tabulka na serveru SQL (příklady T-SQL)

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

  1. Jak zjistit první a poslední datum aktuálního roku?

  2. [01000][unixODBC][Správce ovladačů]Nelze otevřít knihovnu '/usr/local/easysoft/oracle/InstantClient112/lib/libsqora.so':soubor nenalezen

  3. MySQL Rollback Query

  4. Jak získat definici vypočítaného sloupce v SQL Server pomocí T-SQL