合并两个 SQL Server 数据库

合并两个 SQL Server 数据库

我想将数据从一个 SQL Server DB 导入到另一个。两个 DB 具有相同的表定义等,但数据不同。主键是自动递增的,因此相同的主键将引用两个 DB 中的不同数据。

在插入第一个数据库时,我需要更新第二个数据库的主键(当然,还有引用它们的任何外键)。我现在不关心数据是否重复。有办法吗?

答案1

你没有说是哪个版本。既然我们在讨论 SQL Server,那么有几种方法可以解决这个问题。如果你使用的是 SQL Server 2005/2008,最简单的方法可能是使用 SQL Server Management Studio 中的导入数据功能。实际上,这样做会创建一个 SSIS 包,使你可以将数据导入组合数据库。这是一种简单的 SSIS 包方法,因此外键可能是一个问题。

如果失败,另一个选择是使用 bcp 将数据从表中导出,但不包含主键/外键引用。这会将数据放入文本文件中。此时,您可以使用 BULK INSERT 将数据带入组合数据库。这里有一个警告,如果外键所在的列不允许 NULL,则这种方法会出现问题。

第三个选项是自己编写脚本,这也相当容易。如果第二个数据库尚未安装在您的 SQL Server 上,则可以将其连接到将要安装组合数据库的 SQL Server。链接服务器连接也可以工作,但总体而言速度会慢得多。然后,您可以相应地编写 INSERT 语句,省去主键字段。对于具有外键引用的表,只要您以正确的顺序加载表,就可以使用 JOIN 来获取引用的正确值。

第四个选项是构建自定义 SSIS 包并按顺序加载表,然后相应地进行查找以确保您具有正确的外键引用值。这比第一步稍微复杂一些,但它可以确保您做对。此外,如果您必须重复此练习,那么您已经拥有该包。另一个优点是它不需要您创建链接服务器连接,并且它将使用最快的插入方法插入组合数据库。

答案2

好的,因为你得到的数据听起来大部分都是不相交的(而且不管有没有重复的数据),我在 Postgres 中使用了一个解决方法可能适用:

  1. 将数据转储为 SQL 命令
    (一系列INSERT语句或其他类似文本且易于编辑的内容)
  2. 编辑转储并删除主键
    (理解正则表达式的编辑器在这里会有所帮助,但并不是绝对必要的,只要它可以对文件中的每一行重复一个操作即可)
  3. 将转储加载到您的 SQL Server DB
    (如果键像SERIALPostgres 中的键一样自动增加和自动填充,您应该为每一行获取新键)

这一切都建立在它们是以那种格式转储数据的简单方法的基础之上(或者编写一个快速的 PHP/ASP/任何脚本来生成 SQL 也可以……)。还请注意,这种技术在处理大量数据集时会变得有点笨拙——限制因素通常是文本编辑器无法处理巨大的文件。

相关内容