T-SQL n'inclut pas le IF NOT EXISTS
clause avec son CREATE TABLE
déclaration, comme le font certains autres SGBD.
Par conséquent, si nous voulons vérifier l'existence de la table avant de la créer dans SQL Server, nous devons utiliser d'autres méthodes.
Option 1 :Vérifier l'ID de l'objet
Dans SQL Server, nous pouvons utiliser le OBJECT_ID()
fonction pour vérifier l'existence de la table avant d'essayer de la créer :
IF OBJECT_ID(N'dbo.t1', N'U') IS NULL
CREATE TABLE dbo.t1 (
c1 int,
c2 varchar(10)
);
GO
L'exemple ci-dessus vérifie l'ID d'objet pour un dbo.t1
tableau.
Le deuxième argument de OBJECT_ID()
spécifie le type d'objet que nous recherchons. Dans ce cas, nous utilisons U
, qui est pour "table définie par l'utilisateur".
Le OBJECT_ID()
renvoie le numéro d'identification d'objet de base de données d'un objet de portée schéma. Si l'objet n'existe pas, ou si vous n'y avez pas accès, la fonction renvoie NULL. Par conséquent, nous pouvons rechercher une valeur NULL et ne créer la table que si cette fonction renvoie NULL.
Nous pouvons utiliser le OBJECT_ID()
fonction pour vérifier l'ID d'objet de la table une fois qu'elle a été créée :
SELECT OBJECT_ID(N'dbo.t1', N'U');
Exemple de résultat :
354100302
Si nous voulions un peu plus d'informations, nous pourrions faire quelque chose comme ceci :
sp_tables 't1';
Résultat :
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | KrankyKranes | dbo | t1 | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Ici, KrankyKranes
est la base de données dans laquelle j'ai créé la table.
Il existe de nombreuses autres façons de consulter les tables existantes. Voir 6 façons de vérifier si une table existe dans SQL Server pour des exemples.
Option 2 :Interroger sys.tables
Une autre façon de vérifier si une table existe déjà est d'interroger le sys.tables
vue du catalogue système.
Exemple :
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)
);
Cela fait une chose similaire à l'exemple précédent; il vérifie l'existence de la table et ne la crée que si elle n'existe pas.
Quelle que soit la méthode utilisée pour vérifier l'existence de la table, la commande se termine avec succès, que la table existe ou non.
Nous obtenons donc le résultat suivant des deux méthodes :
Commands completed successfully.
Je reçois ce message si la table existait déjà ou non.
Si la table existe déjà, mais que nous ne vérifions pas l'existence de la table, nous obtenons une erreur comme celle-ci :
Msg 2714, Level 16, State 6, Line 1 There is already an object named 't1' in the database.
Il est important de noter que, ce n'est pas parce qu'une table de ce nom existe déjà dans la base de données qu'elle a la bonne définition. Les méthodes ci-dessus vérifient simplement la table par nom et schéma.