我有一个大量的程序,可以进行大量的删除操作。问题是:
我想知道是否有办法构建一个查询,在其中我给它一个表名,然后它会显示我需要删除的所有表,然后再删除这个表。有人可以帮我一把吗?
答案 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图。