Come verificare l'esistenza del tipo di tabella definita dall'utente in SQL Server 2008?


164

Ho un tipo di tabella definito dall'utente. Voglio verificarne l'esistenza prima di modificarlo in una patch usando la OBJECT_ID(name, type)funzione.

Ciò che typedal conteggio dovrebbe essere passato per i tipi di tabella definiti dall'utente?

N'U' come per la tabella definita dall'utente non funziona, ad es IF OBJECT_ID(N'MyType', N'U') IS NOT NULL

Risposte:


188

Puoi cercare in sys.types o utilizzare TYPE_ID:

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

Solo una precauzione: l'uso di type_id non verificherà che il tipo sia un tipo di tabella , solo che esiste un tipo con quel nome. Altrimenti la query di gbn è probabilmente migliore.


Stavo ingenuamente cercando di fare IF OBJECT_ID(N'MyType', 'TT') IS NULLsenza successo, ma la tua soluzione ha funzionato.
Allon Guralnek,

1
L'enumerazione 'TT' funziona solo in SQL Server 2012 o versioni successive (come ho appena scoperto)
Iain,

3
@Iain In realtà non lo è ancora. Non puoi utilizzare OBJECT_ID per cercare un tipo di tabella in base al nome - verificaSELECT 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 ... non sono oggetti con ambito schema, quindi non saranno in sys.objects

Aggiornamento, marzo 2013

È possibile utilizzare TYPE_ID troppo


5
Credo che il tuo secondo commento sia impreciso. Se non sbaglio, i tipi definiti dall'utente sono in effetti nell'ambito dello schema ( Schema_IDin realtà è uno degli attributi nella tabella sys.types a cui sei collegato; ecco perché possono essere indicati come [dbo]. [MyUDType] ). Tuttavia, hai ragione nel dire che i tipi di UD non sono elencati in sys.objects e quindi non sono accessibili da OBJECT_ID (). (Per qualsiasi motivo, sys.objects non è un elenco esaustivo di oggetti con ambito schema.)
kmote

1
@kmote - Non sono elencati sys.objectsdirettamente ma c'è una riga lì per ognuno di questi
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 che questa sia una risposta più completa poiché controlla anche lo schema.
Hamid Heydarian,

6

I seguenti esempi funzionano per me, si prega di notare "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

È inoltre possibile utilizzare la vista table_types di sistema

IF EXISTS (SELECT *
           FROM   [sys].[table_types]
           WHERE  user_type_id = Type_id(N'[dbo].[UdTableType]'))
  BEGIN
      PRINT 'EXISTS'
  END 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.