J'écris une procédure stockée dans SQL Server 2008. Je dois vérifier si une table existe dans la base de données. Sinon, je dois le créer.
Comment puis-je faire cela?
Quelque chose comme ça
IF NOT EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[YourTable]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[YourTable](
....
....
....
)
END
Juste pour le contraste, j'aime utiliser la fonction object_id comme indiqué ci-dessous. C'est un peu plus facile à lire, et vous n'avez pas à vous soucier de sys.objects vs sysobjects vs sys.all_objects vs sys.tables. Forme basique:
IF object_id('MyTable') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
Bien sûr, cela affichera comme "Présent" s'il y a aucun objet présent avec ce nom. Si vous voulez vérifier uniquement les tables, il vous faut:
IF object_id('MyTable', 'U') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
Cela fonctionne aussi pour les tables temporaires:
IF object_id('tempdb.dbo.#MyTable') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
Créons un exemple de base de données avec une table à l'aide du script ci-dessous:
CREATE DATABASE Test
GO
USE Test
GO
CREATE TABLE dbo.tblTest (Id INT, Name NVARCHAR(50))
Approche 1: utilisation de la vue INFORMATION_SCHEMA.TABLES
Nous pouvons écrire une requête comme ci-dessous pour vérifier si une table tblTest existe dans la base de données actuelle.
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'tblTest')
BEGIN
PRINT 'Table Exists'
END
La requête ci-dessus vérifie l'existence de la table tblTest sur tous les schémas de la base de données actuelle. Au lieu de cela si vous souhaitez vérifier l'existence de la table dans un schéma spécifié et dans la base de données spécifiée, nous pouvons écrire la requête ci-dessus comme suit:
IF EXISTS (SELECT * FROM Test.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'tblTest')
BEGIN
PRINT 'Table Exists'
END
Avantages de cette approche: Les vues INFORMATION_SCHEMA étant portables sur différents systèmes de SGBDR, le transfert de données sur un autre SGBDR n’exige aucune modification.
Approche 2: Utilisation de la fonction OBJECT_ID ()
Nous pouvons utiliser la fonction OBJECT_ID()
comme ci-dessous pour vérifier si une table tblTest existe dans la base de données actuelle.
IF OBJECT_ID(N'dbo.tblTest', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
La spécification des parties Nom de la base de données et Nom du schéma pour le Nom de la table est facultative. Toutefois, la spécification du nom de la base de données et du nom du schéma fournit une option permettant de vérifier l’existence de la table dans la base de données spécifiée et dans un schéma spécifié, au lieu d’archiver la base de données actuelle dans tous les schémas. La requête ci-dessous montre que, même si la base de données actuelle est la base de données MASTER, nous pouvons vérifier l’existence de la table tblTest
dans le schéma dbo
de la base de données Test
.
USE MASTER
GO
IF OBJECT_ID(N'Test.dbo.tblTest', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
Avantages: facile à retenir. Un autre point notable à mentionner à propos de la fonction OBJECT_ID()
est la suivante: il permet de vérifier l’existence de la table temporaire créée dans le contexte de connexion actuel. Toutes les autres approches vérifie l'existence de la table temporaire créée dans tous les contextes de connexion au lieu du seul contexte de connexion actuel. La requête ci-dessous montre comment vérifier l'existence d'une table temporaire à l'aide de la fonction OBJECT_ID()
:
CREATE TABLE #TempTable(ID INT)
GO
IF OBJECT_ID(N'TempDB.dbo.#TempTable', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
GO
Approche 3: Utilisation de la vue catalogue sys.Objects
Nous pouvons utiliser la vue catalogue Sys.Objects
pour vérifier l'existence de la table comme indiqué ci-dessous:
IF EXISTS(SELECT 1 FROM sys.Objects WHERE Object_id = OBJECT_ID(N'dbo.tblTest') AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Approche 4: Utilisation de la vue catalogue sys.Tables
Nous pouvons utiliser la vue catalogue Sys.Tables
pour vérifier l'existence de la table comme indiqué ci-dessous:
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'tblTest' AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Sys.Tables
la vue catalogue hérite des lignes de la vue Sys.Objects
, Sys.objects
est appelée vue de base, où sys.Tables
est appelée vue dérivée. Sys.Tables
renverra les lignes uniquement pour les objets de la table, tandis que Sys.Object
affichera les lignes des objets de la table, mais renvoie également des lignes pour les objets telles que: procédure stockée, vues, etc.
Approche 5: évitez d'utiliser la table sys.sysobjects System
Nous devrions éviter d'utiliser sys.sysobjects
System Table directement; son accès direct sera obsolète dans certaines versions futures du serveur SQL. Selon le lien [Microsoft BOL] [1], Microsoft suggère d'utiliser directement les vues de catalogue sys.objects/sys.tables
au lieu de sys.sysobjects
.
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'tblTest' AND xtype = N'U')
BEGIN
PRINT 'Table Exists'
END
Référence: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
ÉDITÉ
Vous pouvez regarder dans sys.tables pour vérifier l'existence de la table désirée:
IF NOT EXISTS (SELECT * FROM sys.tables
WHERE name = N'YourTable' AND type = 'U')
BEGIN
CREATE TABLE [SchemaName].[YourTable](
....
....
....
)
END
IF (EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'd020915'))
BEGIN
declare @result int
set @result=1
select @result as result
END
Declare @Username varchar(20)
Set @Username = 'Mike'
if not exists
(Select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'tblEmp')
Begin
Create table tblEmp (ID int primary key, Name varchar(50))
Print (@Username + ' Table created successfully')
End
Else
Begin
Print (@Username + ' : this Table Already exists in the database')
End
Essayez l'instruction suivante pour vérifier l'existence d'une table dans la base de données:
If not exists (select name from sysobjects where name = 'tablename')
Vous pouvez créer la table à l'intérieur du bloc if.