SQL Server用户定义表类型名称异常,无法正常删除问题咨询
SQL Server用户定义表类型删除失败的原因及解决方法
问题原因
- 错误依赖系统视图:你在
sys_objects里看到的TT_udtt_Total_7D98A078是SQL Server生成的内部对象名,并非你创建时的用户定义表类型名称。直接基于sys_objects做判断或删除操作,根本没定位到真实的用户类型,自然无法删除。 - 存在依赖对象或活跃会话:即便定位到正确的类型名,只要有存储过程、函数、触发器等对象依赖该类型,或者当前有活跃会话正在使用该类型(比如声明了该类型的变量),
DROP TYPE语句就会执行失败,报错类型已存在。
解决步骤
1. 找到真实的用户定义表类型名称
执行以下SQL,通过内部关联获取你创建时的类型名:
SELECT t.name AS user_defined_type_name, o.name AS internal_object_name FROM sys.table_types t JOIN sys.objects o ON t.type_table_object_id = o.object_id WHERE o.name = 'TT_udtt_Total_7D98A078';
执行结果里的user_defined_type_name列就是你需要操作的真实类型名。
2. 检查并清理依赖对象
执行以下SQL,找出所有依赖该类型的对象(将dbo.你的真实类型名替换为上一步查到的名称):
SELECT referencing_schema_name, referencing_entity_name, referencing_class_desc FROM sys.dm_sql_referencing_entities('dbo.你的真实类型名', 'TYPE');
根据结果,要么修改这些依赖对象移除对该类型的引用,要么先删除这些依赖对象,再执行DROP TYPE。
3. 终止正在使用该类型的活跃会话
执行以下SQL,找到正在使用该类型的会话:
SELECT s.session_id, s.login_name, s.host_name, t.text AS recent_sql FROM sys.dm_exec_sessions s JOIN sys.dm_exec_connections c ON s.session_id = c.session_id CROSS APPLY sys.dm_exec_sql_text(c.most_recent_sql_handle) t WHERE t.text LIKE '%你的真实类型名%';
确认可以终止这些会话后,执行KILL 会话ID结束对应的连接(注意:不要随意终止业务会话,避免影响正常运行)。
4. 正确的删除判断语句
使用专门针对用户定义表类型的系统视图sys.table_types做存在性判断,替换为你的真实类型名:
IF EXISTS ( SELECT 1 FROM sys.table_types WHERE name = '你的真实类型名' AND schema_id = SCHEMA_ID('dbo') ) BEGIN DROP TYPE dbo.你的真实类型名; END
内容的提问来源于stack exchange,提问作者Maury Markowitz
相关产品推荐
相关产品推荐

