使用 DTS 导入/导出向导导入数据时如何处理 FK 约束?

22 sql-server sql-server-2012

我正在尝试使用 SQL Server 导入和导出向导将数据从我的生产数据库复制到我的开发数据库,​​但是当我这样做时失败并出现错误“插入语句与外键约束冲突”我有超过 40 个表FK 约束,是否有一些简单的方法可以解决这个问题,而不必编写删除约束/添加约束脚本?

编辑:我刚刚发现在我正在运行的 SQL Server 的 Web 版中,DTS 不会让您保存包。

小智 38

我在 SQLTeam.com 上得到了这个解决方案:

用:

 EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
Run Code Online (Sandbox Code Playgroud)

然后导入你的数据

EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'
Run Code Online (Sandbox Code Playgroud)

使用这种方法,我能够毫无问题地导入所有数据。


小智 8

我从我无法控制的服务器上在我的机器上生成了数据库的精确副本。

我是个笨蛋,但这就是我所做的:

  1. 从我在源代码管理中的脚本创建数据库(提示,提示!)如果您没有脚本,您始终可以通过Tasks选项从现有数据库生成它。

  2. 如果任何数据在创建时自动插入到YourDB中,请运行DELETE FROM YourDB.dbo.tblYourTable.

    • 当外键存在时,您无法截断数据,因此您必须使用DELETE.
  3. 在目标服务器上运行: USE YourDB; EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all';

  4. 右键单击YourDBObject Explorer。点击Tasks->Import Data...

  5. 向导的前几个屏幕是不言自明的。

  6. Select Source Table and Views向导屏幕上,单击要复制的每个表旁边的复选框。

  7. 对于该屏幕上的每一行(表格),单击它使其突出显示,然后单击Edit Mappings

  8. 对于每一行(表格),单击/检查Append rows to the destination tableEnable identity insert

    • 如果你点击Delete rows in destination table它会失败,因为它没有发出DELETE命令,它发出的TRUNCATE命令仍然与我们的外键冲突,因为TRUNCATE它不受之前的约束NOCHECK CONSTRAINT
  9. 单击向导的其余部分,然后单击Finish

  10. 注意错误;警告可能可以忽略。

    • 如果有错误,请单击Report按钮并查看报告。尝试和苏斯什么是SuccessErrorStopped。您可能需要修复该报告中某处隐藏的错误根本原因。然后,您可能需要执行DELETE FROM YourDB.dbo.theErrorTable. 现在单击导入向导上的后退按钮并取消选中每个Success. 无限重复。
  11. 在目标服务器上运行: USE YourDB; EXEC sp_msforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all';

    • 如果有错误,......我不知道,但修复它们并重试!
  12. 好极了!:)

感谢在 SE 网络上回答这个问题和类似问题的每个人帮助我解决这个问题。