web-dev-qa-db-fra.com

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

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

Qu'est-ce que type du énumération doit être passé 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

149
abatishchev

Vous pouvez rechercher dans sys.types ou utiliser TYPE_ID:

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

Juste une précaution: utiliser type_id ne vérifiera pas que le type est un table - juste un type par celui-ci nom existe. Sinon, la requête de gbn est probablement meilleure.

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

sys.types ... ce ne sont pas des objets au schéma, donc ils ne seront pas dans sys.objects

Mise à jour, mars 2013

Vous pouvez aussi utiliser TYPE_ID

100
gbn
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)
);
17
Tom Groszko

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
6
wu liang

Vous pouvez également utiliser la vue système table_types

IF EXISTS (SELECT *
           FROM   [sys].[table_types]
           WHERE  user_type_id = Type_id(N'[dbo].[UdTableType]'))
  BEGIN
      PRINT 'EXISTS'
  END 
4
Maciej Zawiasa