You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server用户定义表类型名称异常,无法正常删除问题咨询

SQL Server用户定义表类型删除失败的原因及解决方法

问题原因

  1. 错误依赖系统视图:你在sys_objects里看到的TT_udtt_Total_7D98A078是SQL Server生成的内部对象名,并非你创建时的用户定义表类型名称。直接基于sys_objects做判断或删除操作,根本没定位到真实的用户类型,自然无法删除。
  2. 存在依赖对象或活跃会话:即便定位到正确的类型名,只要有存储过程、函数、触发器等对象依赖该类型,或者当前有活跃会话正在使用该类型(比如声明了该类型的变量),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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 14:12:38