如何在SQL Server中将表的数据从database1复制并覆盖到database2

时间:2014-10-12 09:50:36

标签: sql sql-server database sql-server-2008

我有一个database1,它有超过500个表,我有database2也有相同数量的表,并且在两个数据库中表的名称相同..一些表具有不同的表定义,例如reports中的表database1有9列,reports中的表database2有10列。

我想将所有数据从database1复制到database2,如果结构不匹配,它应该覆盖相同的数据并附加列。我在SQL Server 2008中尝试了导入导出向导,但在复制行的最后一步时出现错误。我现在没有关于该错误的屏幕截图,这是我的办公室电脑。它说错误插入只读列xyz,有时它说vs_isbroken,对于只读列错误,因为我提到了启用了身份插入,但它没有帮助..

请帮帮我。这对我来说是我办公室里的一个机会。

4 个答案:

答案 0 :(得分:4)

SSIS和SQL Server 2008向导可能是挑剔的工具。

如果你得到一个"不能插入ABC"列,那么它可能是以下之一:

  • 插入PK柱 - >设置映射时,需要指示覆盖值
  • 插入具有较小范围的列 - >例如,从nvarchar(256)到nvarchar(50)
  • 插入计算列(由@ Nick.McDermaid指出)

如果您的数据库使用此参与完整性,您也可能会遇到参照完整性问题。

如果您要更频繁地执行此操作,那么我建议您构建SSIS包而不是使用向导工具。通过这种方式,您可以看到各种问题的警告,例如我上面描述的问题。然后,您可以按需运行包。

我要做的另一个建议是,你将DB1插入" stage" DB2中的表。这些表应该没有关系完整性,并允许您将过程分解为以下几个步骤。

  • 将数据从DB1转移到DB2
  • 针对与您的数据库/规则相关的问题制作报告/查询
  • 使用SQL
  • 将阶段表中的数据合并到目标表中

最后一步是您可以使用合并语句,或简单的插入/更新,具体取决于键匹配。然后,在本地数据库中使用SQL可以使用集合论来管理两个集合的重叠,并找出新的或要更新的内容。

SSIS"可以"这样做,但您将无法使用SSIS进行批量更新,而使用SQL则可以。 SSIS将执行所谓的RBAR(通过痛苦排行),缓慢而且要避免。

我建议您告知您的老年人,这需要更长时间才能确保其可靠且结果可报告。然后逐步完成工作,报告每个阶段的完成情况。

另外两个小建议:

  • 创建每个阶段表的_Archive表,并为每个阶段表添加Tstamp列。在阶段步骤之后合并到这些阶段,这将允许您快速查看何时将哪些行引入DB2
  • 在阶段之后和SQL合并步骤之前,在阶段表上创建索引。这将改善合并性能
  • 每次合并后删除这些索引,这将增加批量插入性能

基本分期(回答问题澄清):

链接:

分段是将数据从一个地方移动到另一个地方而无需任何检查的行为。

  1. 首先,您需要创建目标表,架构应与源表匹配。
  2. 打开BIDS并创建一个新项目,并在其中创建一个新的SSIS包。
  3. 在包中,为源服务器创建连接,为目标创建另一个连接。
  4. 然后创建数据流步骤,在步骤中为要复制的每个表创建数据源。
  5. 将每个来源连接到新的数据目的地,并设置适当的连接和表格。
  6. 完成后,保存并进行测试运行。
  7. 在数据流步骤之前,您可能希望添加一个将截断所有目标表的SQL步骤。

答案 1 :(得分:2)

如果您愿意使用工具,那么使用Red Gate Sql CompareRed Gate SQL Data Compare之类的内容呢?

首先,我将使用数据比较来管理架构差异,从源(database1)向目标数据库(database2)添加所需的新列。然后使用数据比较,您可以根据您指定如何处理的名称匹配表中的内容。然后,您可以选择要从目的地复制的数据。因此,您将看到哪些数据是新的以及哪些数据不同(您可以删除目标中不在源中的数据或忽略它)。您可以让工具完成工作,也可以创建一个脚本,以便在需要时运行。

如果您想进行实验,可以进行为期15天的试用。

答案 2 :(得分:0)

似乎您正在寻找SQL Server Replication提供的复制技术。

答案 3 :(得分:0)

好吧,如果我理解你的要求,你需要让database2成为database1的副本。为什么不对database1进行完整备份并将其还原为database2?您的database2将是备份时database1的确切内容。