web-dev-qa-db-fra.com

Vérifiez si la table existe et si elle n'existe pas, créez-la dans SQL Server 2008

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?

116
Prady

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
137
SQLMenace

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'
144
Philip Kelley

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/

12
Vahid Farahmandian

É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
11
veljasije
IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE  TABLE_NAME = 'd020915'))
BEGIN
  declare @result int
  set @result=1
  select @result as result
END
3
Vinod kumar
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
0
Aamir Shaikh

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.

0
Only You