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

如何编写SQL Server查询找出未被存储过程使用的表

找出数据库中未被任何存储过程引用的表

直接查询方案(无需临时表)

不用先把表放进临时表,直接通过系统表关联就能一次性找出所有未被存储过程引用的表:

SELECT 
    SCHEMA_NAME(t.schema_id) AS schema_name,
    t.name AS table_name
FROM sys.tables t
WHERE NOT EXISTS (
    SELECT 1
    FROM sys.procedures p
    JOIN sys.sql_modules sm ON p.object_id = sm.object_id
    WHERE sm.definition LIKE '%' + SCHEMA_NAME(t.schema_id) + '.' + t.name + '%'
)
-- 如果要指定特定架构,加上下面的条件
-- AND SCHEMA_NAME(t.schema_id) = '你的架构名'
ORDER BY schema_name, table_name;

基于已有临时表的查询方案

如果你已经把目标表放进了临时表(比如#TempTables,包含schema_name和table_name两列),可以用下面的查询筛选出其中未被引用的表:

SELECT 
    tt.schema_name,
    tt.table_name
FROM #TempTables tt
WHERE NOT EXISTS (
    SELECT 1
    FROM sys.procedures p
    JOIN sys.sql_modules sm ON p.object_id = sm.object_id
    WHERE sm.definition LIKE '%' + tt.schema_name + '.' + tt.table_name + '%'
)
ORDER BY tt.schema_name, tt.table_name;

注意事项

  • 这个方法依赖sys.sql_modules.definition里的明文代码,不会识别加密的存储过程,如果有加密存储过程,需要额外处理。
  • 可能存在误判:如果表名作为字符串常量出现在存储过程里(比如SELECT 'dbo.UserTable'),也会被判定为被引用,这种情况需要结合实际业务进一步验证。
  • 通配符转义:如果表名里包含%或_这类通配符字符,需要用ESCAPE子句处理,比如把LIKE条件改成LIKE '%' + REPLACE(REPLACE(tt.table_name, '%', '\%'), '_', '\_') + '%' ESCAPE '\'(架构名同理)。

内容的提问来源于stack exchange,提问作者Zachary Golla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:27:14