如何编写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
相关产品推荐
相关产品推荐

