【问题标题】:what's the easiest way to dynamically/programatically drop tables sequentially based on their dependencies?根据依赖关系动态/以编程方式依次删除表的最简单方法是什么?
【发布时间】:2018-04-08 04:10:28
【问题描述】:

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

【问题讨论】:

  • Visual Studio 有“模式比较”——我认为这对你有用
  • @juergen - 不知道为什么我的桌子设计会出错,它使用标准 fk
  • @nick 我认为架构比较不会为我动态生成脚本
  • 嗯,到目前为止你尝试了什么?你读过this SO post?

标签: sql sql-server tsql


【解决方案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)

如果您有要删除的表的列表,可以将其放在另一个游标中,它将针对每个表运行。

【讨论】:

  • 提示:将对象名称组装成动态 SQL 语句时的最佳做法是使用 QuoteName() 以避免出现奇怪名称的问题,例如New Table 带有空格或保留字,例如 From
猜你喜欢
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 2010-12-21
  • 1970-01-01
相关资源
最近更新 更多