如果存在,则 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 删除类型 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL:删除所有重复的行但保留一个[重复]

如果存在则删除表 Oracle,SQL Developer [重复]

如果存储过程尚不存在,则创建它,但不要更改也不要删除现有的存储过程

SQLServer之删除约束

如果尚不存在则创建存储过程,但是不要更改并且不要删除现有的存储过程

如果 Oracle SQL 中存在则删除视图 [重复]