Як перевірити наявність типу таблиці, визначеної користувачем у SQL Server 2008?


164

У мене визначений користувачем тип таблиці. Я хочу перевірити його існування перед редагуванням у патчі за допомогою OBJECT_ID(name, type)функції.

Що typeз перерахування слід передати для визначених користувачем типів таблиць?

N'U' наприклад, для визначеної користувачем таблиці не працює, тобто IF OBJECT_ID(N'MyType', N'U') IS NOT NULL

Відповіді:


188

Ви можете шукати в sys.types або використовувати TYPE_ID:

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

Просто застереження: за допомогою type_id не буде підтверджено, що тип є табличним типом - лише те, що існує тип під цим іменем. Інакше запит gbn, мабуть, кращий.


Я наївно намагався зробити це IF OBJECT_ID(N'MyType', 'TT') IS NULLбез успіху, але ваше рішення спрацювало.
Аллон Гуралнек

1
Перерахування 'TT' працює лише на сервері sql 2012 або пізнішої версії (як я щойно з'ясував)
Iain

3
@Iain Насправді все ще немає. Ви не можете використовувати OBJECT_ID для пошуку типу таблиці за назвою - перевіритиSELECT 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 ... вони не є об'єктами, що охоплюють схему, тому не будуть у sys.objects

Оновлення, березень 2013 року

Ви можете використовувати TYPE_ID занадто


5
Я вважаю, що ваш другий коментар є неточним. Якщо я не помиляюся, типи, визначені користувачем, дійсно є схемними ( Schema_IDНасправді це один з атрибутів таблиці sys.types, з якою ви пов’язані; саме тому на них можна посилатися як [dbo]. [MyUDType] ). Тим не менш, ви вірні, що типи UD не перелічені у sys.objects, а тому OBJECT_ID () не доступний. (З будь-якої причини, sys.objects не є вичерпним переліком об'єктів, на яких поширюються схеми.)
kmote

1
@kmote - Вони не вказані sys.objectsбезпосередньо, але для кожного з них є ряд
Мартін Сміт

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

Я думаю, що це більш повна відповідь, оскільки вона перевіряє схему.
Хамід Гейдарян

6

Наступні приклади працюють для мене, зверніть увагу "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

Ви також можете використовувати представлення системних таблиць_типів

IF EXISTS (SELECT *
           FROM   [sys].[table_types]
           WHERE  user_type_id = Type_id(N'[dbo].[UdTableType]'))
  BEGIN
      PRINT 'EXISTS'
  END 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.