182 votes

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 de l'éditer dans un patch en utilisant la fonction OBJECT_ID(name, type) fonction.

Quoi type de la énumération doit être passée pour les types de table définis par l'utilisateur ?

N'U' comme pour les tables définies par l'utilisateur ne fonctionne pas, c'est à dire que IF OBJECT_ID(N'MyType', N'U') IS NOT NULL

210voto

DyingCactus Points 15843

Vous pouvez regarder 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érifiera pas que le type est un tableau juste qu'un type de ce nom existe. Sinon, la requête de gbn est probablement meilleure.

1 votes

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

1 votes

L'énumération 'TT' ne fonctionne que dans sql server 2012 ou ultérieur (comme je viens de le découvrir).

4 votes

@Iain Ça ne l'est toujours pas, en fait. Vous ne pouvez pas utiliser OBJECT_ID pour rechercher un type de table par son nom. SELECT name FROM sys.objects WHERE type = 'TT'

124voto

gbn Points 197263
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 objets-système

Mise à jour, mars 2013

Vous pouvez utiliser TYPE_ID trop

5 votes

Je crois que votre deuxième commentaire est inexact. Si je ne me trompe pas, les types définis par l'utilisateur sont en effet adaptés aux schémas. Schema_ID est en fait l'un des attributs de la sys.types 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 ne sont donc pas accessibles par OBJECT_ID(). (Pour une raison quelconque, sys.objects n'est pas une liste exhaustive des objets à portée de schéma).

1 votes

@kmote - Ils ne sont pas répertoriés dans sys.objects directement mais il y a une rangée pour chacun d'entre eux

20voto

Tom Groszko Points 41
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)
);

0 votes

Je pense que cette réponse est plus complète puisqu'elle vérifie également le schéma.

0 votes

Où se trouve la valeur de schema_id proviennent-ils ? (puisque ce n'est pas dans l'OP)

6voto

wu liang Points 611

Les exemples suivants fonctionnent pour moi, veuillez noter "is_user_defined" et non "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

4voto

Maciej Zawiasa Points 159

Vous pouvez également utiliser la vue table_types du système.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X