Sql 什么';根据表的依赖关系按顺序动态/编程删除表的最简单方法是什么?
我需要以动态/编程的方式在数据库中删除一组表。这将需要按顺序进行,以避免矛盾错误。例如,需要在用户表之前删除UserRole表。我确信这是可以做到的,但我不确定最简单的方法是什么。您不需要删除所有相关的表来删除所需的表,只需删除构成两个表之间关系的约束即可。此代码将删除约束,然后删除所需的表Sql 什么';根据表的依赖关系按顺序动态/编程删除表的最简单方法是什么?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要以动态/编程的方式在数据库中删除一组表。这将需要按顺序进行,以避免矛盾错误。例如,需要在用户表之前删除UserRole表。我确信这是可以做到的,但我不确定最简单的方法是什么。您不需要删除所有相关的表来删除所需的表,只需删除构成两个表之间关系的约束即可。此代码将删除约束,然后删除所需的表 DECLARE @Statement VARCHAR(300); DECLARE @TableName VARCHAR(300) = 'del'; DECLARE @Schema VARCHAR
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)
如果您有一个要删除的表列表,可以将其放在另一个游标中,它将针对每个表运行。Visual Studio有“模式比较”-我想这对我来说是可行的you@juergen-不确定为什么我的桌子设计会出错-它使用标准fk's@nick我不认为schema compare会动态地为我生成脚本。那么,到目前为止您尝试了什么?您是否阅读了提示:将对象名称组合到动态SQL语句中时的最佳实践是避免出现奇数名称问题,例如带有空格的
新表
,或像From
这样的保留字。