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. Si ce n'est pas le cas, je dois le créer.
Comment puis-je faire cela?
CREATE TABLE IF NOT EXISTS ...
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. Si ce n'est pas le cas, je dois le créer.
Comment puis-je faire cela?
CREATE TABLE IF NOT EXISTS ...
Réponses:
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
if (not exists (select object_id from sys.objects where object_id = OBJECT_ID(N'[dbo].[client_tgi_g67_period_list]') and type = 'U'))
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 montrera comme "Présent" s'il y a un objet présent avec ce nom. Si vous souhaitez vérifier uniquement les tableaux, vous aurez besoin de:
IF object_id('MyTable', 'U') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
Cela fonctionne également 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 par le 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 la base de données spécifiée, nous pouvons écrire la requête ci-dessus comme ci-dessous:
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 sont portables sur différents systèmes SGBDR, donc le portage vers différents SGBDR ne nécessite aucune modification.
Approche 2: Utilisation de la fonction OBJECT_ID ()
Nous pouvons utiliser la OBJECT_ID()
fonction 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. Mais la spécification du nom de la base de données et du nom du schéma fournit une option pour 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 de vérifier la base de données actuelle sur 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 tblTest
table dans le dbo
schéma dans la Test
base de données.
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 OBJECT_ID()
fonction est: il fournit une option pour vérifier l'existence de la table temporaire qui est créée dans le contexte de connexion actuel. Toutes les autres approches vérifient l'existence de la table temporaire créée dans tous les contextes de connexions au lieu de simplement le contexte de connexion actuel. La requête ci-dessous montre comment vérifier l'existence d'une table temporaire à l'aide de la OBJECT_ID()
fonction:
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 Sys.Objects
vue catalogue 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 Sys.Tables
vue catalogue 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 de catalogue hérite des lignes de la Sys.Objects
vue de catalogue, la vue de Sys.objects
catalogue est appelée vue de base où elle sys.Tables
est appelée vue dérivée. Sys.Tables
retournera les lignes uniquement pour les objets Table alors que la Sys.Object
vue en plus de renvoyer les lignes pour les objets table, elle renvoie des lignes pour les objets tels que: procédure stockée, vues, etc.
Approche 5: éviter d'utiliser la table système sys.sysobjects
Nous devrions éviter d'utiliser sys.sysobjects
directement System Table, l'accès direct à celui-ci sera obsolète dans certaines versions futures du serveur SQL. Conformément au lien [Microsoft BOL] [1], Microsoft suggère d'utiliser les vues de catalogue sys.objects/sys.tables
au lieu de la sys.sysobjects
table système directement.
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/
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.
sysobjects
existe une vue de compatibilité qui n'existe que pour éviter de casser du code plus ancien. Ma suggestion serait de vues du catalogue système d'utilisation (par exemple sys.objects
, sys.tables
) pour le code qui ne cibleront les instances SQL Server 2008, et des vues de schéma d'information (par exemple information_schema.tables
) pour le code qui doit être portable. Vous pouvez trouver plus d'informations sur les différentes vues ici: Interrogation du catalogue système SQL Server
Si je ne me trompe pas, cela devrait fonctionner:
if not exists (Select 1 from tableName)
create table ...