Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

6 façons de vérifier si une table existe dans SQL Server (exemples T-SQL)

Cet article propose cinq options pour vérifier si une table existe dans SQL Server. La plupart des options impliquent l'interrogation d'une vue système, mais l'une des options exécute une procédure stockée système et une autre implique une fonction.

J'inclus également quelques simples IF déclarations qui peuvent être modifiées en fonction de votre situation.

Option 1 - La vue sys.tables

Cette option interroge les sys.tables vue du catalogue système. Cette vue renvoie une ligne pour chaque table utilisateur. Par conséquent, vous pouvez l'interroger en utilisant le nom de la table que vous recherchez.

Exemple :

SELECT 
  object_id 
FROM sys.tables
WHERE name = 'Artists';

Résultat :

+-------------+
| object_id   |
|-------------|
| 885578193   |
+-------------+

Vous pouvez également ajouter le nom du schéma aux éléments que vous recherchez. Voici comment modifier la requête précédente pour inclure le nom du schéma :

SELECT
  object_id  
FROM sys.tables
WHERE name = 'Artists'
AND SCHEMA_NAME(schema_id) = 'dbo';

Résultat :

+-------------+
| object_id   |
|-------------|
| 885578193   |
+-------------+

Notez que les sys.tables view ne renvoie que l'ID de schéma, j'ai donc dû le transmettre au SCHEMA_NAME() fonction pour obtenir son nom. Sinon, j'aurais pu utiliser l'ID de schéma si j'avais su cela.

Exemple :

SELECT
  object_id  
FROM sys.tables
WHERE name = 'Artists'
AND schema_id = 1;

Résultat :

+-------------+
| object_id   |
|-------------|
| 885578193   |
+-------------+

Option 2 - La procédure stockée sp_tables

L'option suivante exécute le sp_tables procédure stockée.

Voici à quel point votre code peut être succinct lorsque vous utilisez cette méthode :

sp_tables 'Artists'

Résultat :

+-------------------+---------------+--------------+--------------+-----------+
| TABLE_QUALIFIER   | TABLE_OWNER   | TABLE_NAME   | TABLE_TYPE   | REMARKS   |
|-------------------+---------------+--------------+--------------+-----------|
| Music             | dbo           | Artists      | TABLE        | NULL      |
+-------------------+---------------+--------------+--------------+-----------+

Cependant, cette procédure stockée renvoie des vues ainsi que des tables, c'est donc une bonne idée de la limiter aux seules tables (sauf si vous souhaitez également que les vues soient renvoyées). Pour le réduire aux seules tables, utilisez @table_type = "'TABLE'" .

Pendant que vous y êtes, vous pouvez également spécifier le propriétaire de la table et le qualificateur de table.

Exemple :

EXEC sp_tables 
  @table_name = 'Artists',  
  @table_owner = 'dbo',
  @table_qualifier = 'Music',
  @table_type = "'TABLE'",
  @fUsePattern = 1;

Résultat :

+-------------------+---------------+--------------+--------------+-----------+
| TABLE_QUALIFIER   | TABLE_OWNER   | TABLE_NAME   | TABLE_TYPE   | REMARKS   |
|-------------------+---------------+--------------+--------------+-----------|
| Music             | dbo           | Artists      | TABLE        | NULL      |
+-------------------+---------------+--------------+--------------+-----------+

Il est important de noter que le @table_type Le paramètre accepte une liste séparée par des virgules. Par conséquent, c'est un peu différent des autres paramètres. Le @table_type valeur doit être entre guillemets doubles et chaque élément entre guillemets simples. Dans mon exemple, il n'y a qu'un seul élément de liste, cependant, il doit toujours être placé entre guillemets doubles et simples.

Option 3 – INFORMATION_SCHEMA.TABLES

Le INFORMATION_SCHEMA.TABLES La vue système renvoie une ligne pour chaque table ou vue de la base de données actuelle pour laquelle l'utilisateur actuel dispose d'autorisations. C'est similaire à sys.tables , mais il renvoie moins de colonnes. Les vues de schéma d'informations incluses dans SQL Server sont conformes à la définition standard ISO pour INFORMATION_SCHEMA.

Voici un exemple d'utilisation pour vérifier si une table existe dans la base de données actuelle :

SELECT * 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME = 'Artists';

Résultat :

+-----------------+----------------+--------------+--------------+
| TABLE_CATALOG   | TABLE_SCHEMA   | TABLE_NAME   | TABLE_TYPE   |
|-----------------+----------------+--------------+--------------|
| Music           | dbo            | Artists      | BASE TABLE   |
+-----------------+----------------+--------------+--------------+

Le revoilà, mais cette fois je précise aussi le schéma :

SELECT * 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME = 'Artists'
AND TABLE_SCHEMA = 'dbo';

Résultat :

+-----------------+----------------+--------------+--------------+
| TABLE_CATALOG   | TABLE_SCHEMA   | TABLE_NAME   | TABLE_TYPE   |
|-----------------+----------------+--------------+--------------|
| Music           | dbo            | Artists      | BASE TABLE   |
+-----------------+----------------+--------------+--------------+

Option 4 - La fonction OBJECT_ID()

Vous pouvez également utiliser une fonction telle que OBJECT_ID() pour voir s'il renvoie une valeur non NULL.

Exemple :

SELECT OBJECT_ID('Artists', 'U') AS Result;

Résultat :

+-----------+
| Result    |
|-----------|
| 885578193 |
+-----------+

Dans ce cas, la table existe. Notez que j'ai utilisé U pour indiquer le type d'objet (table définie par l'utilisateur).

Vous pouvez également fournir un nom en trois parties pour inclure la base de données et le schéma :

SELECT OBJECT_ID('Music.dbo.Artists', 'U') AS Result;

Résultat :

+-----------+
| Result    |
|-----------|
| 885578193 |
+-----------+

Si la table n'existe pas, vous obtiendrez NULL :

SELECT OBJECT_ID('Oops!', 'U') AS Result;

Résultat :

+----------+
| Result   |
|----------|
| NULL     |
+----------+

Voir ci-dessous pour un exemple d'utilisation dans un IF déclaration.

Option 5 - La vue sys.objects

Comme si aucun des exemples précédents ne ferait l'affaire, voici encore une autre façon de vérifier si une table existe.

Cette fois, j'interroge le sys.objects vue du catalogue système. Cette vue renvoie une ligne pour chaque objet défini par l'utilisateur et étendu au schéma dans la base de données. Il ne se contente pas de renvoyer des tables, il renvoie toutes sortes d'objets. Par conséquent, nous devons le réduire aux seules tables. Dans ce cas, je ne suis intéressé que par les tables définies par l'utilisateur, je peux donc utiliser type = 'U' (U est pour "USER_TABLE"). Vous pouvez également utiliser TYPE_DESC = 'USER_TABLE' .

SELECT 
  object_id 
FROM sys.objects 
WHERE type = 'U' 
AND name = 'Artists';

Résultat :

+-------------+
| object_id   |
|-------------|
| 885578193   |
+-------------+

Le revoilà, mais en précisant le schéma :

SELECT 
  object_id  
FROM sys.objects 
WHERE type = 'U' 
AND name = 'Artists'
AND SCHEMA_NAME(schema_id) = 'dbo';

Résultat :

+-------------+
| object_id   |
|-------------|
| 885578193   |
+-------------+

Option 6 - La vue sys.sysobjects (AVOID)

Cette option n'est répertoriée que pour que je puisse recommander de ne pas l'utiliser. Les sys.sysobjects La vue est incluse dans SQL Server pour la rétrocompatibilité, et Microsoft vous recommande d'éviter d'utiliser cette vue dans les travaux futurs.

Si vous rencontrez du code qui utilise cette vue, envisagez de le modifier pour utiliser sys.objects ou une autre vue système ou procédure stockée.

Dans tous les cas, voici à quoi pourrait ressembler l'exemple précédent si vous utilisez sys.sysobjects au lieu de sys.objects .

SELECT
  id  
FROM sys.sysobjects 
WHERE xtype = 'U' 
AND name = 'Artists';

Résultat :

+-----------+
| id        |
|-----------|
| 885578193 |
+-----------+

Énoncé SI 1

Voici un simple IF qui vérifie l'existence de la table, puis imprime un message différent en fonction du résultat. Ce code peut être modifié pour répondre à vos besoins spécifiques.

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';

Résultat :

The table exists

Et voici à quoi cela ressemble lorsque la table n'existe pas :

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';

Résultat :

The table does not exist

Énoncé SI 2

Voici un autre IF déclaration qui peut être modifiée pour répondre à vos besoins spécifiques.

IF OBJECT_ID('Artists', 'U') IS NOT NULL  
  PRINT 'The table exists'
ELSE 
  PRINT 'The table does not exist';

Résultat :

The table exists