Como verificar a existência do tipo de tabela definida pelo usuário no SQL Server 2008?

164

Eu tenho um tipo de tabela definido pelo usuário. Quero verificar sua existência antes de editar um patch usando a OBJECT_ID(name, type)função

O que typeda enumeração deve ser passado para tipos de tabela definidos pelo usuário?

N'U' como para tabela definida pelo usuário não funciona, ou seja, IF OBJECT_ID(N'MyType', N'U') IS NOT NULL

abatishchev
fonte

Respostas:

188

Você pode procurar em sys.types ou usar TYPE_ID:

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

Apenas uma precaução: usar type_id não verificará se o tipo é um tipo de tabela - apenas que existe um tipo com esse nome. Caso contrário, a consulta do gbn é provavelmente melhor.


fonte
Eu estava tentando ingenuamente, IF OBJECT_ID(N'MyType', 'TT') IS NULLsem sucesso, mas sua solução funcionou.
Alon Guralnek
1
A enumeração 'TT' só funciona no SQL Server 2012 ou mais tarde (como eu só descobri)
Iain
3
@Iain Ainda não, na verdade. Você não pode usar OBJECT_ID para procurar um tipo de tabela por nome - check-outSELECT 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 ... eles não são objetos com escopo no esquema, portanto não estarão em sys.objects

Atualização, mar 2013

Você pode usar TYPE_ID demais

gbn
fonte
5
Acredito que seu segundo comentário seja impreciso. Se não me engano, os Tipos Definidos pelo Usuário têm o escopo do esquema ( Schema_IDna verdade, é um dos atributos da tabela sys.types a que você vinculou; é por isso que eles podem ser referenciados como [dbo]. [MyUDType] ) No entanto, você está certo de que os tipos de UD não estão listados em sys.objects e, portanto, não são acessíveis por OBJECT_ID (). (Por alguma razão, sys.objects não é uma lista exaustiva de objetos com escopo de esquema.)
kmote
1
@kmote - Eles não estão listados sys.objectsdiretamente, mas há uma linha para cada um deles #
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
fonte
Penso que esta é uma resposta mais completa, uma vez que também verifica o esquema.
Hamid Heydarian
6

Os exemplos a seguir funcionam para mim, observe "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
fonte
4

Você também pode usar a visualização table_types do sistema

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