在SQL Server中删除/重新创建类型

时间:2017-06-12 11:48:34

标签: sql sql-server sql-server-2008 tsql sql-server-2012

IF OBJECT_ID('[dbo].[Order]') IS NOT NULL
    DROP TYPE [dbo].[Order]
GO

CREATE TYPE [dbo].[Order] AS TABLE 
(
    [Id] INT NULL,
    [Order] INT NULL
);

此代码不会删除表。我收到这个错误:

  

类型'dbo.Order'已存在,或者您无权创建它。

如何在SQL Server中删除/重新创建类型?

5 个答案:

答案 0 :(得分:2)

您的任何存储过程都可能正在使用此表类型。这就是为什么它不允许你放弃。您可能会收到以下错误。

Msg 3732,Level 16,State 1,Line 4 无法删除类型'tabletype',因为它被对象' storedprocedurename '引用。可能有其他对象引用此类型。

Msg 219,Level 16,State 1,Line 3 “tabletype”类型已存在,或者您无权创建它。

检查storedprocedure或函数名称。只需评论一段时间的使用情况,一旦删除参考。您可以删除并重新创建表类型。之后取消注释存储过程/函数中的引用用法。

这肯定会有效!!

答案 1 :(得分:1)

  

SQL Server 2016及更高版本

DROP TYPE IF EXISTS [Tablename];
GO

CREATE TYPE [DBO].[Tablename] AS TABLE
(Test VARCHAR(50))
GO
  

降低SQL服务器的范围

IF EXISTS(SELECT * FROM sys.types WHERE is_table_type = 1 AND NAME ='Tablename')
BEGIN
    DROP TYPE [dbo].[Tablename]
END
GO

CREATE TYPE [DBO].[Tablename] AS TABLE
(Test VARCHAR(50))
GO

答案 2 :(得分:1)

IF EXISTS(
Select 1 from sys.table_types where user_type_id = TYPE_ID(N'dbo.Order')
    )
    Begin

    DROP TYPE [dbo].[Order]

    CREATE TYPE [dbo].[Order] AS TABLE 
    (
     [Id]    INT NULL,
     [Order] INT NULL
    );

   END

答案 3 :(得分:1)

尝试将SELECT对Object_ID的检查替换为INFORMATION_SCHEMA.DOMAINS(对于SQL Server 2012):

IF EXISTS( SELECT * FROM INFORMATION_SCHEMA.DOMAINS WHERE Domain_Name = 'Order' )
    DROP TYPE [dbo].[Order]

CREATE TYPE [dbo].[Order] AS TABLE 
(
    [Id] INT NULL,
    [Order] INT NULL
);

答案 4 :(得分:0)

注释掉存储过程中所有类型存在的地方可能是艰巨的任务,而且注释不清,这容易出错。我使用的一个技巧是右键单击要更改的类型,然后选择“脚本将UDT类型创建到新查询窗口”,然后更改名称(例如,在类型名称后添加2)。然后,我进入使用此类型的存储过程,更改为新创建的类型并进行更改。然后,我可以自由更改原始类型。完成之后,我可以返回存储过程中的原始类型并删除类型2。这样我们可以更快,更可靠。