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