我如何编写一个查询(SQL Server),基于表,它可以返回它引用的所有表?

时间:2017-06-08 14:45:52

标签: sql-server

我有一个大量的程序,可以进行大量的删除操作。问题是:

  1. 此删除中缺少表格(需要删除)
  2. 我对删除的顺序很难。
  3. 我想知道是否有办法构建一个查询,在其中我给它一个表名,然后它会显示我需要删除的所有表,然后再删除这个表。有人可以帮我一把吗?

3 个答案:

答案 0 :(得分:1)

以下查询返回所有具有指向@tablename中的表的外键的表。

declare @tablename sysname = 'your table name';
select OBJECT_NAME(parent_object_id) parent_object_name
from sys.foreign_keys
where OBJECT_NAME(referenced_object_id) = @tablename;

在放弃你的桌子之前,所有这些都必须被删除。

(在SQL Server 2014中测试)

另外一个想法 - 如果你需要进入下一级,找到引用这个表列表的所有外键,你可以使用一个公用表表达式:

declare @tablename sysname = 'your table name';
;with cte as (
    select OBJECT_NAME(parent_object_id) parent_object_name, OBJECT_NAME(referenced_object_id) referenced_object_name
    from sys.foreign_keys
    where OBJECT_NAME(referenced_object_id) = @tablename
    union all
    select OBJECT_NAME(parent_object_id) parent_object_name, OBJECT_NAME(referenced_object_id)
    from sys.foreign_keys fk
    inner join cte on OBJECT_NAME(fk.referenced_object_id) = cte.parent_object_name
)
select * from cte

答案 1 :(得分:0)

  

显示删除此表之前需要删除的所有表格

看看外键关系。但如果没有定义,你只需要卷起袖子并分析存储过程。

答案 2 :(得分:0)

一个快速的解决方案是使用(不建议使用的)sp_depends存储过程来返回对象的依赖关系,例如:

exec sp_depends 'mySprocName';

更好的解决方案是使用sys.dm_sql_referenced_entities表值函数返回所有引用的实体。这提供了比sp_depends更多的细节。与所有表值函数一样,它可以是更大查询的一部分:

select distinct referenced_entity_name  
into #tables
from sys.dm_sql_referenced_entities ( 'mySproc','OBJECT')

article显示了如何使用此类方法从此类系统函数和视图创建PlantUML图。