web-dev-qa-db-fra.com

Pourquoi OBJECT_ID est-il utilisé pour vérifier si une table existe ou non?

Je dois vérifier si une table existe dans SQL ou non.

Sinon, il doit en créer un automatiquement.

Maintenant, j'ai recherché et trouvé ce codage:

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

Quelqu'un peut-il expliquer pourquoi il est écrit où object_id = OBJECT_ID et que dois-je mettre à sa place?

28
user2564223

J'aime cette syntaxe:

if(object_id(N'[dbo].[YourTable]', 'U') is not null)
...

Où object_id prend le type d'objet à 2 caractères comme second paramètre. Vous pouvez trouver la liste des types d'objets listés ci-dessous dans la documentation sys.objects :

  • AF = fonction d'agrégation (CLR)
  • C = contrainte de vérification
  • D = DEFAULT (contrainte ou autonome)
  • F = contrainte de clé étrangère
  • FN = fonction scalaire SQL
  • FS = fonction scalaire d'assemblage (CLR)
  • FT = fonction table de valeur d'assemblage (CLR)
  • IF = fonction de table inline SQL
  • IT = table interne
  • P = procédure stockée SQL
  • PC = Assembly (CLR) procédure stockée
  • PG = guide de plan
  • PK = contrainte PRIMARY KEY
  • R = règle (ancien style, autonome)
  • RF = procédure de filtrage de réplication
  • S = table de base du système
  • SN = synonyme
  • SO = objet séquence
  • SQ = File d'attente de service
  • Déclencheur DML TA = Assembly (CLR)
  • TF = fonction de table SQL
  • TR = déclencheur DML SQL 
  • TT = type de table
  • U = Table (définie par l'utilisateur)
  • UQ = contrainte UNIQUE
  • V = Voir
  • X = procédure stockée étendue
75
Jason

La méthode ISO SQL pour vérifier l'existence d'un objet de niveau table est la vue INFORMATION_SCHEMA.TABLES.

Il n'y a rien mal avec sys.objects mais .... INFORMATION_SCHEMA.TABLES est un peu plus déclaratif - et c'est multi-plateforme (ce qui souvent n'a pas d'importance, mais peut-être toujours Nice.)

Je pense que cela est probablement plus lisible pour un nouveau codeur:

DECLARE @tableName SYSNAME = 'tbfoo'
DECLARE @schemaNAme SYSNAME = 'fooSchema'

IF EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @tableName AND TABLE_SCHEMA = @schemaName )
BEGIN
    RAISERROR('%s exists in schema: %s', 0, 1, @tableName, @schemaName)
END
ELSE
BEGIN
    RAISERROR('%s DOES NOT EXIST in schema: %s', 0, 1, @tableName, @schemaName)
END

Ne vous inquiétez pas pour la commande RAISERROR, c’est une façon agréable d’imprimer des messages formatés.

Vous pouvez interroger la vue INFORMATION_SCHEMA pour avoir une idée de son contenu.

SELECT TOP 5 * FROM INFORMATION_SCHEMA.TABLES

Comme vous pouvez le constater, vous pouvez référencer les schémas et les catalogues par leur nom plutôt que de rechercher leur ID avec OBJECT_ID ().

7
Transact Charlie
object_id = OBJECT_ID(N'[dbo].[YourTable]')

object_id est le nom de la colonne dans sys.objects

OBJECT_ID est une fonction qui retourne la ID pour l'objet que vous spécifiez, c'est-à-dire YourTable.

Vous comparez l'ID d'objet de YourTable avec la colonne object_id de la table sys.objects. Vous devez remplacer YourTable par le nom de la table que vous souhaitez vérifier existe déjà.

1
Darren

OBJECT_ID() est une fonction qui renvoie l'ID d'objet. Voir la documentation:

Renvoie le numéro d'identification de l'objet de base de données d'un objet à portée de schéma objet.

http://msdn.Microsoft.com/en-us/library/ms190328.aspx


En lui transmettant certains paramètres (par exemple, les détails de votre table), il retournera un ID. Vous pouvez ensuite comparer cela aux ID de la table sys.objects pour vérifier s’il existe déjà.

1
Curt