Answers:
您可以查看sys.types或使用TYPE_ID:
IF TYPE_ID(N'MyType') IS NULL ...
只是预防措施:使用type_id不会验证类型是否为表类型-只是存在具有该名称的类型。否则,gbn的查询可能更好。
SELECT name FROM sys.objects WHERE type = 'TT'
IF EXISTS (SELECT * FROM sys.types WHERE is_table_type = 1 AND name = 'MyType')
--stuff
sys.types ...它们不是架构范围的对象,因此不会出现在sys.objects中
更新,2013年3月
您可以使用TYPE_ID太
Schema_ID
实际上,它是您链接到的sys.types表中的属性之一;这就是为什么可以将它们引用为[dbo]。[myUDType] )。不过,您是正确的,因为UD类型未在sys.objects中列出,因此OBJECT_ID()无法访问。(无论出于何种原因,sys.objects都不是架构范围内的对象的详尽列表。)
sys.objects
直接列出,但是每一个都有一行
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)
);
您还可以使用系统table_types视图
IF EXISTS (SELECT *
FROM [sys].[table_types]
WHERE user_type_id = Type_id(N'[dbo].[UdTableType]'))
BEGIN
PRINT 'EXISTS'
END
IF OBJECT_ID(N'MyType', 'TT') IS NULL
没有成功,但是您的解决方案有效。