我需要动态地/以编程方式在数据库中删除一组表。这将需要按顺序完成,以避免约束错误。例如,需要在User表之前删除UserRole表。我确信这可以做到,但我不确定最简单的方法是做什么。
答案 0 :(得分:1)
您不需要删除所有相关表来删除所需的表,只需删除构成2个表之间关系的约束。此代码将删除约束,然后删除所需的表。
DECLARE @Statement VARCHAR(300);
DECLARE @TableName VARCHAR(300) = 'del';
DECLARE @Schema VARCHAR(300) = 'dbo';
DECLARE @DelStatement nvarchar (100);
-- Cursor to generate ALTER TABLE DROP CONSTRAINT statements
DECLARE cur CURSOR FOR
SELECT 'ALTER TABLE ' + OBJECT_SCHEMA_NAME(parent_object_id) + '.' +
OBJECT_NAME(parent_object_id) +
' DROP CONSTRAINT ' + name
FROM sys.foreign_keys
WHERE OBJECT_SCHEMA_NAME(referenced_object_id) = @Schema AND
OBJECT_NAME(referenced_object_id) = @TableName;
OPEN cur;
FETCH cur INTO @Statement;
-- Drop each found foreign key constraint
WHILE @@FETCH_STATUS = 0
BEGIN
exec(@Statement);
FETCH cur INTO @Statement;
END
CLOSE cur;
DEALLOCATE cur;
-- Drop the table
SET @DelStatement = 'drop table '+@Schema+'.'+@TableName
exec(@DelStatement)
如果您有要删除的表的列表,可以将其放在另一个游标中,它将针对每个表运行。