Sql server 我们是否可以使用SQL查询来列出数据库中任何过程中未引用的所有表?

Sql server 我们是否可以使用SQL查询来列出数据库中任何过程中未引用的所有表?,sql-server,sql-server-2008-r2,procedure,Sql Server,Sql Server 2008 R2,Procedure,SQL查询,它将列出数据库中未在任何过程中使用的所有表。比解析过程体IMHO更干净: select name into #temp from sys.tables update #temp set name = CONCAT('%',name,'%') select name into #temp2 from #temp delete from #temp2 insert into #temp2 SELECT T.Name FROM sys.procedures SP, #temp

SQL查询,它将列出数据库中未在任何过程中使用的所有表。

比解析过程体IMHO更干净:

select  name into #temp from sys.tables

update #temp 
set name = CONCAT('%',name,'%')

select name into #temp2 from #temp
delete from #temp2


insert into #temp2
SELECT T.Name FROM sys.procedures SP, #temp T
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE T.name

SELECT * FROM #temp
EXCEPT
SELECT * FROM #temp2

drop table #temp
drop table #temp2
SELECT s.name, t.name
  FROM sys.schemas AS s
  INNER JOIN sys.tables AS t
  ON s.[schema_id] = t.[schema_id]
  WHERE NOT EXISTS
  (
    SELECT 1 
      FROM sys.sql_expression_dependencies AS d
      INNER JOIN sys.procedures AS p
      ON d.referencing_id = p.[object_id]
      WHERE d.referenced_id = t.[object_id]
  );

注意:这不会捕获以表名为参数的存储过程,也不会动态生成它们并作为动态SQL执行。

比解析过程体更简洁:

SELECT s.name, t.name
  FROM sys.schemas AS s
  INNER JOIN sys.tables AS t
  ON s.[schema_id] = t.[schema_id]
  WHERE NOT EXISTS
  (
    SELECT 1 
      FROM sys.sql_expression_dependencies AS d
      INNER JOIN sys.procedures AS p
      ON d.referencing_id = p.[object_id]
      WHERE d.referenced_id = t.[object_id]
  );

注意:这不会捕获以表名为参数的存储过程,也不会动态生成它们并作为动态SQL执行。

今天的提示:始终使用现代的显式
JOIN
语法。更容易写(没有错误),更容易阅读和维护,如果需要,更容易转换为外部连接!这对我不起作用(Aaron的回答是这样的),因为我使用的是SQL 2008R2,何时可以升级我的SQL server取决于Capital@JonTout:2008R2中唯一不起作用的是
CONCAT
,它被简单地替换了(
set name='%'+name+'%'
)。尽管如此,这仍然不是一个很好的方法。今天的提示:始终使用现代的、显式的
JOIN
语法。更容易写(没有错误),更容易阅读和维护,如果需要,更容易转换为外部连接!这对我不起作用(Aaron的回答是这样的),因为我使用的是SQL 2008R2,何时可以升级我的SQL server取决于Capital@JonTout:2008R2中唯一不起作用的是
CONCAT
,它被简单地替换了(
set name='%'+name+'%'
)。尽管如此,这仍然不是一个很好的方法。什么版本的SQL Server?答案可能因版本而异。SQL Server的哪个版本?答案可能因版本而异。