Làm cách nào để kiểm tra sự tồn tại của loại bảng do người dùng xác định trong SQL Server 2008?


164

Tôi có một loại bảng do người dùng định nghĩa. Tôi muốn kiểm tra sự tồn tại của nó trước khi chỉnh sửa trong một bản vá bằng OBJECT_ID(name, type)chức năng.

Điều gì typetừ bảng liệt kê nên được thông qua cho các loại bảng do người dùng định nghĩa?

N'U' như đối với bảng do người dùng định nghĩa không hoạt động, tức là IF OBJECT_ID(N'MyType', N'U') IS NOT NULL

Câu trả lời:


188

Bạn có thể xem trong sys.types hoặc sử dụng TYPE_ID:

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

Chỉ cần đề phòng: sử dụng type_id sẽ không xác minh rằng loại đó là loại bảng - chỉ tồn tại một loại theo tên đó. Nếu không, truy vấn của gbn có lẽ tốt hơn.


Tôi đã ngây thơ cố gắng làm IF OBJECT_ID(N'MyType', 'TT') IS NULLmà không thành công, nhưng giải pháp của bạn đã làm việc.
Allon Guralnek

1
Bảng liệt kê 'TT' chỉ hoạt động trong máy chủ sql 2012 trở lên (như tôi vừa tìm ra)
Iain

3
@Iain Nó vẫn không, thực sự. Bạn không thể sử dụng OBJECT_ID để tìm kiếm loại bảng theo tên - hãy xemSELECT name FROM sys.objects WHERE type = 'TT'
NRzingh

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

sys.types ... chúng không phải là các đối tượng trong phạm vi lược đồ nên sẽ không có trong sys.objects

Cập nhật, tháng 3 năm 2013

Bạn có thể sử dụng TYPE_ID quá


5
Tôi tin rằng nhận xét thứ hai của bạn là không chính xác. Nếu tôi không nhầm, Các loại do người dùng xác định thực sự nằm trong phạm vi lược đồ ( Schema_IDThực tế đây là một trong các thuộc tính trong bảng sys.types mà bạn đã liên kết đến; đây là lý do tại sao chúng có thể được tham chiếu là [dbo]. [MyUDType] ). Tuy nhiên, bạn đúng rằng các loại UD không được liệt kê trong sys.objects và do đó OB OB_ID () không thể truy cập được. (Vì bất kỳ lý do gì, sys.objects không phải là danh sách đầy đủ các đối tượng trong phạm vi lược đồ.)
kmote

1
@kmote - Chúng không được liệt kê sys.objectstrực tiếp nhưng có một hàng ở đó cho mỗi thứ
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)
);

Tôi nghĩ rằng đây là một câu trả lời đầy đủ hơn vì nó cũng kiểm tra lược đồ.
Hamid Heydarian

6

Các ví dụ sau hoạt động với tôi, xin lưu ý "is_user_d xác định" KHÔNG "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

Bạn cũng có thể sử dụng chế độ xem bảng_types hệ thống

IF EXISTS (SELECT *
           FROM   [sys].[table_types]
           WHERE  user_type_id = Type_id(N'[dbo].[UdTableType]'))
  BEGIN
      PRINT 'EXISTS'
  END 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.