如果存在,则 T-SQL 删除类型 [重复]
Posted
技术标签:
【中文标题】如果存在,则 T-SQL 删除类型 [重复]【英文标题】:T-SQL DROP TYPE IF EXISTS [duplicate] 【发布时间】:2017-07-13 13:56:52 【问题描述】:我目前正在编写 SQL Server 2014 中的 T-SQL 脚本。
我需要删除用户定义的表类型,但前提是它存在,并在删除/删除类型之后再次创建。
我在网络上做了一些研究并找到了一个解决方案,但很遗憾,它根本不起作用。
我当前的脚本如下所示:
IF OBJECT_ID('MySchema.tProjectType', 'U') IS NOT NULL
DROP TYPE [MySchema].[tProjectType];
CREATE TYPE [MySchema].[tProjectType] AS TABLE
(
Id INT
, IsPrivate BIT
, IsPublic BIT
);
我的错误信息:
“MySchema.tProjectType”类型已经存在,或者您没有创建它的权限。
您知道如何在 SQL Server 2014 中删除用户定义的表类型之前成功检查它是否存在吗?
【问题讨论】:
表类型不是对象——具体来说,它们不是表。请改用TYPE_ID
。
【参考方案1】:
请试试这个,使用 type_id 而不是 object_id
IF type_id('[MySchema].[tProjectType]') IS NOT NULL
DROP TYPE [MySchema].[tProjectType];
CREATE TYPE [MySchema].[tProjectType] AS TABLE
(
Id INT
, IsPrivate BIT
, IsPublic BIT
);
【讨论】:
SQL Server 2016 SP1 以后,您现在可以简单地使用 DROP TYPE IF EXISTS ... 根据本文docs.microsoft.com/en-us/sql/t-sql/statements/…【参考方案2】:使用TYPE_ID
或查询sys.table_types
【讨论】:
OBJECT_ID
将不起作用。每个表类型都有一个 TT
对象,但它有一个系统生成的名称。
@JeroenMostert 我以为他们已经解决了这个问题,因为***.com/a/2495240/27535
明确验证这不适用于 SQL Server 2016 SP1 CU。 OBJECT_ID('x')
和 OBJECT_ID('x', 'TT')
都不会返回表类型 x
的结果。支持内部表的名称类似于TT_x_12345678
。我不认为你真的应该对它做任何事情。它的存在是为了完整性(以及任何约束),但表并不是真正的类型。【参考方案3】:
试试这个
IF EXISTS (SELECT 1 FROM sys.types WHERE is_table_type = 1 AND name ='tProjectType')
Begin
DROP TYPE [tProjectType];
CREATE TYPE [tProjectType] AS TABLE
(
Id INT
, IsPrivate BIT
, IsPublic BIT
);
END
在删除表类型之前检查表类型是否在任何存储过程中使用,否则会引发错误,例如表类型具有依赖关系
【讨论】:
以上是关于如果存在,则 T-SQL 删除类型 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如果存在则删除表 Oracle,SQL Developer [重复]
如果存储过程尚不存在,则创建它,但不要更改也不要删除现有的存储过程