Sql 什么';根据表的依赖关系按顺序动态/编程删除表的最简单方法是什么?

Sql 什么';根据表的依赖关系按顺序动态/编程删除表的最简单方法是什么?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要以动态/编程的方式在数据库中删除一组表。这将需要按顺序进行,以避免矛盾错误。例如,需要在用户表之前删除UserRole表。我确信这是可以做到的,但我不确定最简单的方法是什么。您不需要删除所有相关的表来删除所需的表,只需删除构成两个表之间关系的约束即可。此代码将删除约束,然后删除所需的表 DECLARE @Statement VARCHAR(300); DECLARE @TableName VARCHAR(300) = 'del'; DECLARE @Schema VARCHAR

我需要以动态/编程的方式在数据库中删除一组表。这将需要按顺序进行,以避免矛盾错误。例如,需要在用户表之前删除UserRole表。我确信这是可以做到的,但我不确定最简单的方法是什么。

您不需要删除所有相关的表来删除所需的表,只需删除构成两个表之间关系的约束即可。此代码将删除约束,然后删除所需的表

  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
这样的保留字。