it-swarm.com.de

Wie überprüfe ich das Vorhandensein eines benutzerdefinierten Tabellentyps in SQL Server 2008?

Ich habe einen benutzerdefinierten Tabellentyp. Ich möchte überprüfen, ob es existiert, bevor ich einen Patch mit der Funktion OBJECT_ID(name, type) bearbeite.

Welches type aus Aufzählung sollte für benutzerdefinierte Tabellentypen übergeben werden?

N'U' Wie bei einer benutzerdefinierten Tabelle funktioniert nicht, d. H. IF OBJECT_ID(N'MyType', N'U') IS NOT NULL

149
abatishchev

Sie können in sys.types suchen oder TYPE_ID verwenden:

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

Nur eine Vorsichtsmaßnahme: Mit type_id wird nicht überprüft, ob der Typ eine Tabelle ist type - nur, dass ein Typ mit diesem Namen existiert. Ansonsten ist die Abfrage von gbn wahrscheinlich besser.

164
user121301
IF EXISTS (SELECT * FROM sys.types WHERE is_table_type = 1 AND name = 'MyType')
    --stuff

sys.types ... es handelt sich nicht um Objekte mit Schemabereich, daher ist dies nicht in sys.objects der Fall

Update, März 2013

Sie können auch TYPE_ID verwenden

100
gbn
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)
);
17
Tom Groszko

Die folgenden Beispiele funktionieren für mich, bitte beachten Sie "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
6
wu liang

Sie können auch die Systemansicht table_types verwenden

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