¿Cómo verificar la existencia del tipo de tabla definida por el usuario en SQL Server 2008?

164

Tengo un tipo de tabla definida por el usuario. Quiero verificar su existencia antes de editar en un parche usando la OBJECT_ID(name, type)función.

¿Qué se debe pasar typede la enumeración para los tipos de tabla definidos por el usuario?

N'U' como para la tabla definida por el usuario no funciona, es decir IF OBJECT_ID(N'MyType', N'U') IS NOT NULL

abatishchev
fuente

Respuestas:

188

Puede buscar en sys.types o usar TYPE_ID:

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

Solo una precaución: el uso de type_id no verificará que el tipo sea un tipo de tabla , solo que existe un tipo con ese nombre. De lo contrario, la consulta de gbn probablemente sea mejor.


fuente
Intentaba ingenuamente hacerlo IF OBJECT_ID(N'MyType', 'TT') IS NULLsin éxito, pero su solución funcionó.
Allon Guralnek
1
La enumeración 'TT' solo funciona en el servidor SQL 2012 o posterior (como acabo de descubrir)
Iain
3
@Iain Todavía no, en realidad. No puede usar OBJECT_ID para buscar un tipo de tabla por nombre, consulteSELECT 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 ... no son objetos de ámbito de esquema, por lo que no estarán en sys.objects

Actualización, mar 2013

Puede utilizar TYPE_ID demasiado

gbn
fuente
55
Creo que tu segundo comentario es inexacto. Si no me equivoco, los tipos definidos por el usuario tienen un alcance de esquema ( Schema_IDde hecho, es uno de los atributos en la tabla sys.types a la que se vinculó; es por eso que se puede hacer referencia a ellos como [dbo]. [MyUDType] ) Sin embargo, tiene razón en que los tipos de UD no se enumeran en sys.objects y, por lo tanto, OBJECT_ID () no puede acceder a ellos. (Por alguna razón, sys.objects no es una lista exhaustiva de objetos con alcance de esquema.)
kmote
1
@kmote - No se enumeran sys.objectsdirectamente, pero hay una fila allí para cada uno de ellos
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)
);
Tom Groszko
fuente
Creo que esta es una respuesta más completa ya que también comprueba el esquema.
Hamid Heydarian
6

Los siguientes ejemplos me funcionan, tenga en cuenta que "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
wu liang
fuente
4

También puede usar la vista system table_types

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