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?
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
la source
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:
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:
Cela fonctionne également pour les tables temporaires:
la source
Créons un exemple de base de données avec une table par le script ci-dessous:
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.
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:
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.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 ledbo
schéma dans laTest
base de données.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 laOBJECT_ID()
fonction: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: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:Sys.Tables
la vue de catalogue hérite des lignes de laSys.Objects
vue de catalogue, la vue deSys.objects
catalogue est appelée vue de base où ellesys.Tables
est appelée vue dérivée.Sys.Tables
retournera les lignes uniquement pour les objets Table alors que laSys.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 cataloguesys.objects/sys.tables
au lieu de lasys.sysobjects
table système directement.Référence: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
la source
ÉDITÉ
Vous pouvez consulter sys.tables pour vérifier l'existence de la table souhaitée:
la source
la source
la source
Essayez l'instruction suivante pour vérifier l'existence d'une table dans la base de données:
Vous pouvez créer la table à l'intérieur du bloc if.
la source
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 exemplesys.objects
,sys.tables
) pour le code qui ne cibleront les instances SQL Server 2008, et des vues de schéma d'information (par exempleinformation_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 ServerSi je ne me trompe pas, cela devrait fonctionner:
la source