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中删除/重新创建类型?
答案 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。这样我们可以更快,更可靠。