Comment vérifier l'existence d'un type de table défini par l'utilisateur dans SQL Server 2008?


164

J'ai un type de table défini par l'utilisateur. Je veux vérifier son existence avant de modifier un patch en utilisant la OBJECT_ID(name, type)fonction.

Que doit-on passer typede l' énumération pour les types de table définis par l'utilisateur?

N'U' comme pour la table définie par l'utilisateur ne fonctionne pas, c'est-à-dire IF OBJECT_ID(N'MyType', N'U') IS NOT NULL

Réponses:


188

Vous pouvez rechercher dans sys.types ou utiliser TYPE_ID:

IF TYPE_ID(N'MyType') IS NULL ...

Juste une précaution: l'utilisation de type_id ne vérifie pas que le type est un type de table - juste qu'un type de ce nom existe. Sinon, la requête de gbn est probablement meilleure.


J'essayais naïvement de faire IF OBJECT_ID(N'MyType', 'TT') IS NULLsans succès, mais votre solution a fonctionné.
Allon Guralnek

1
L'énumération `` TT '' ne fonctionne que dans le serveur SQL 2012 ou version ultérieure (comme je viens de le découvrir)
Iain

3
@Iain Ce n'est toujours pas le cas, en fait. Vous ne pouvez pas utiliser OBJECT_ID pour rechercher un type de table par nom - vérifierSELECT name FROM sys.objects WHERE type = 'TT'
NReilingh

109
IF EXISTS (SELECT * FROM sys.types WHERE is_table_type = 1 AND name = 'MyType')
    --stuff

sys.types ... ils ne sont pas des objets à portée de schéma et ne seront donc pas dans sys.objects

Mise à jour, mars 2013

Vous pouvez utiliser TYPE_ID aussi


5
Je pense que votre deuxième commentaire est inexact. Si je ne me trompe pas, les types définis par l'utilisateur sont en effet à portée de schéma (il Schema_IDs'agit en fait de l'un des attributs de la table sys.types auquel vous avez lié; c'est pourquoi ils peuvent être référencés comme [dbo]. [MyUDType] ). Néanmoins, vous avez raison de dire que les types UD ne sont pas répertoriés dans sys.objects, et donc pas accessibles par OBJECT_ID (). (Pour une raison quelconque, sys.objects n'est pas une liste exhaustive d'objets à portée de schéma.)
kmote

1
@kmote - Ils ne sont pas répertoriés sys.objectsdirectement mais il y a une ligne pour chacun d'eux
Martin Smith

20
IF EXISTS(SELECT 1 FROM sys.types WHERE name = 'Person' AND is_table_type = 1 AND SCHEMA_ID('VAB') = schema_id)
DROP TYPE VAB.Person;
go
CREATE TYPE VAB.Person AS TABLE
(    PersonID               INT
    ,FirstName              VARCHAR(255)
    ,MiddleName             VARCHAR(255)
    ,LastName               VARCHAR(255)
    ,PreferredName          VARCHAR(255)
);

Je pense que c'est une réponse plus complète car elle vérifie également le schéma.
Hamid Heydarian

6

Les exemples suivants fonctionnent pour moi, veuillez noter "is_user_defined" NOT "is_table_type"

IF TYPE_ID(N'idType') IS NULL
CREATE TYPE [dbo].[idType] FROM Bigint NOT NULL
go

IF not EXISTS (SELECT * FROM sys.types WHERE is_user_defined = 1 AND name = 'idType')
CREATE TYPE [dbo].[idType] FROM Bigint NOT NULL
go

4

Vous pouvez également utiliser la vue table_types système

IF EXISTS (SELECT *
           FROM   [sys].[table_types]
           WHERE  user_type_id = Type_id(N'[dbo].[UdTableType]'))
  BEGIN
      PRINT 'EXISTS'
  END 
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.