在SQL Server中启用所有可能的约束

在SQL Server中启用所有可能的约束,sql,sql-server,Sql,Sql Server,最近我不得不迁移数据。为此,我使用此命令禁用了所有约束 EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" 我已将所有数据从旧数据库迁移到新数据库。现在我面临一些数据冲突,无法重新启用所有约束。我试过这个命令,但对我无效 EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all" 是否有一种方法可以在没有数据冲突的情况下启用所有外键关系?

最近我不得不迁移数据。为此,我使用此命令禁用了所有约束

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
我已将所有数据从旧数据库迁移到新数据库。现在我面临一些数据冲突,无法重新启用所有约束。我试过这个命令,但对我无效

EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
是否有一种方法可以在没有数据冲突的情况下启用所有外键关系? 请给我做这个任务的查询

注意: 我有大约20个表,它们之间有冲突的数据。我不想对它们启用约束。 我只想在其他没有问题的表上启用约束(大约200个表)。

我认为这不可能自动实现(但我错了:)。 运行
EXEC sp_msforeachtable
时,这实际上是针对每个表分别运行的,这意味着不会应用检查约束与现有数据冲突的约束(并且您可以看到这些表中的错误)

因此,我的想法是执行一次所有表中所有约束的启用,然后查看哪些表仍然存在无法激活的约束。(在这些表上,我们还将停用其他约束…)

从这里我得到了一件很好的东西:

SELECT name, tbl = object_name(parent_obj)
FROM sysobjects
WHERE objectproperty(id, 'CnstIsDisabled') = 1
现在,您将获得所有已禁用的约束及其表名。 执行带有CHECK CHECK CONSTRAINT all的EXEC sp_msforeachtable“ALTER TABLE”后,在这些表上有一些约束错误的表应显示在此查询中(但可能多次显示,因为可能有多个约束在同一个表上失败)

您可以将其进一步修改为

SELECT DISTINCT tbl = object_name(parent_obj), 'EXEC sp_msforeachtable "ALTER TABLE ' + object_name(parent_obj) + ' NOCHECK CONSTRAINT all"'
FROM sysobjects
WHERE objectproperty(id, 'CnstIsDisabled') = 1

现在在最后一列中有了可执行语句,您应该能够选择最后一列的所有行并执行,那么,您应该只在所有约束都可以激活的表上激活约束。

无论如何,这不是一个理想的解决方案……但是如果您想要一种快速而肮脏的方式来系统地浏览所有表并尝试启用约束,我会这样做:

编写一个程序来为您执行此操作

运行此查询以获取所有表名的列表:

selectTABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' 

foreach TABLE_NAME 
{
    try{
        ALTER TABLE TABLE_NAME CHECK CONSTRAINT ALL
    }
    catch{}
}

更好的解决方案是修复表中无法启用此功能的数据,然后只在所有表上启用它。我建议在部分启用时执行此操作。

您需要首先修复数据。@Jeffrey Wieder请阅读此说明。