如何检查SQL Server 2008中用户定义表类型的存在?


164

我有一个用户定义的表类型。我想在使用OBJECT_ID(name, type)功能编辑补丁之前检查它的存在。

什么type枚举应传递用户定义的表类型?

N'U' 例如对于用户定义的表不起作用,即 IF OBJECT_ID(N'MyType', N'U') IS NOT NULL

Answers:


188

您可以查看sys.types或使用TYPE_ID:

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

只是预防措施:使用type_id不会验证类型是否为类型-只是存在具有该名称的类型。否则,gbn的查询可能更好。


我只是天真地尝试IF OBJECT_ID(N'MyType', 'TT') IS NULL没有成功,但是您的解决方案有效。
Allon Guralnek 2013年

1
“ TT”枚举仅适用于sql server 2012或更高版本(正如我刚刚发现的那样)
2015年

3
@Iain实际上,它仍然没有。您不能使用OBJECT_ID通过名称搜索表类型-签出SELECT name FROM sys.objects WHERE type = 'TT'
NReilingh 2015年

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

sys.types ...它们不是架构范围的对象,因此不会出现在sys.objects中

更新,2013年3月

您可以使用TYPE_ID


5
我认为您的第二点评论不正确。如果我没记错的话,用户定义类型的确确实是架构范围的(Schema_ID实际上,它是您链接到的sys.types表中的属性之一;这就是为什么可以将它们引用为[dbo]。[myUDType] )。不过,您是正确的,因为UD类型未在sys.objects中列出,因此OBJECT_ID()无法访问。(无论出于何种原因,sys.objects都不是架构范围内的对象的详尽列表。)
kmote 2012年

1
@kmote-它们没有sys.objects直接列出,但是每一个都有一行
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)
);

我认为这是一个更完整的答案,因为它也会检查架构。
哈米德·黑德安

6

以下示例对我有用,请注意“ is_user_defined”不是“ 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

您还可以使用系统table_types视图

IF EXISTS (SELECT *
           FROM   [sys].[table_types]
           WHERE  user_type_id = Type_id(N'[dbo].[UdTableType]'))
  BEGIN
      PRINT 'EXISTS'
  END 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.