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

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.


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


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)
);

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

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 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.