我必须编写一个删除脚本来删除数据库表中的行.但是,该表有很多子表(外键),那些子表也有子表.
还有所有的关系外键,我想(先叶表了依赖图)利用这些信息获取表的列表,我不得不删除,以正确的顺序.
如何以正确的顺序获取给定表的子表列表?
在您的数据库上尝试此操作,此脚本一次只能为您提供一个表的图表.我假设您有一个Employee表,但您必须更改第2行以检查数据库的特定表:
DECLARE @masterTableName varchar(1000)
SET @masterTableName = 'Employee'
DECLARE @ScannedTables TABLE( Level int, Name varchar(1000) collate Latin1_General_CI_AS )
DECLARE @currentTableCount INT
DECLARE @previousTableCount INT
DECLARE @level INT
SET @currentTableCount = 0
SET @previousTableCount = -1
SET @level = 0
INSERT INTO @ScannedTables VALUES ( @level, @masterTableName )
WHILE @previousTableCount <> @currentTableCount
BEGIN
SET @previousTableCount = @currentTableCount
INSERT INTO @ScannedTables
SELECT DISTINCT
@level + 1, TC.Table_Name COLLATE Latin1_General_CI_AS
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC ON TC.Constraint_Name = RC.Constraint_Name
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FTC ON RC.Unique_Constraint_Name = FTC.Constraint_Name
WHERE TC.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND FTC.TABLE_NAME COLLATE Latin1_General_CI_AS IN ( SELECT Name FROM @ScannedTables WHERE Level = @level )
AND TC.Table_Name COLLATE Latin1_General_CI_AS NOT IN ( SELECT Name FROM @ScannedTables )
SET @level = @level + 1
SELECT @currentTableCount = COUNT(*) FROM @ScannedTables
END
SELECT * FROM @ScannedTables
Run Code Online (Sandbox Code Playgroud)