如何在SQL Server中将表的数据从数据库1复制和覆盖到数据库2

如何在SQL Server中将表的数据从数据库1复制和覆盖到数据库2,sql,sql-server,database,sql-server-2008,Sql,Sql Server,Database,Sql Server 2008,我有一个database1,它有500多个表,我有database2,它也有相同数量的表,在这两个数据库中,表的名称是相同的。。一些表具有不同的表定义,例如database1中的表报告有9列,而database2中的表报告有10列 我想将所有数据从database1复制到database2,如果结构不匹配,它应该覆盖相同的数据并追加列。我在SQL Server 2008中尝试了导入导出向导,但在复制行的最后一步时,它会给出一个错误。我现在没有这个错误的屏幕截图,它是我的办公室电脑。它说错误插入只

我有一个
database1
,它有500多个表,我有
database2
,它也有相同数量的表,在这两个数据库中,表的名称是相同的。。一些表具有不同的表定义,例如
database1
中的表
报告有9列,而
database2
中的表
报告有10列

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


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

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

如果您得到一个“无法插入ABC列”,则它可能是以下之一:

  • 在PK列中插入->设置映射时,需要指示覆盖该值
  • 插入范围较小的列->例如从nvarchar(256)插入nvarchar(50)
  • 插入计算列(由@Nick.McDermaid指出)
如果您的数据库使用引用完整性,您也可能会遇到引用完整性问题(大多数情况下是这样的)

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

我要提出的另一个建议是,将DB1插入DB2中的“stage”表中。这些表不应具有关系完整性,并允许您将流程分解为以下几个步骤

  • 将数据从DB1转移到DB2
  • 就与数据库/规则相关的问题生成报告/查询
  • 使用SQL将阶段表中的数据合并到目标表中
最后一步是可以使用合并语句,或者根据密钥匹配使用简单的插入/更新。然后,在本地数据库中使用SQL就可以使用集合论来管理两个集合的重叠,并找出哪些是新的或要更新的

SSIS“可以”做到这一点,但您将无法使用SSIS进行批量更新,而使用SQL则可以。SSI将执行称为RBAR(一行接一行)的操作,这是一种缓慢且需要避免的操作

我建议你通知你的长辈,这将需要一点时间来确保它是可靠的,结果是可报告的。然后一步一步地工作,报告每个阶段的完成情况

另外两个小建议:

  • 创建每个stage表的_归档表,并在每个表中添加一个Tstamp列。在stage步骤之后合并到这些行中,这将允许您快速查看哪些行是何时引入DB2的
  • 在stage之后和SQL合并步骤之前,在stage表上创建索引。这将提高合并性能
  • 在每次合并后删除这些索引,这将提高批量插入性能
基本分期(回答问题澄清):

链接:

暂存是将数据从一个地方移动到另一个地方而不进行任何检查的行为

  • 首先需要创建目标表,模式应该与源表匹配
  • 打开投标,创建一个新项目,并在其中创建一个新的SSIS包
  • 在包中,为源服务器创建一个连接,为目标服务器创建另一个连接
  • 然后创建数据流步骤,在该步骤中,为要从中复制的每个表创建数据源
  • 将每个源连接到新的数据目标,并设置适当的连接和表
  • 完成后,保存并执行测试运行

  • 在数据流步骤之前,您可能希望添加一个SQL步骤,该步骤将截断所有目标表。

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

    如果您得到一个“无法插入ABC列”,则它可能是以下之一:

    • 在PK列中插入->设置映射时,需要指示覆盖该值
    • 插入范围较小的列->例如从nvarchar(256)插入nvarchar(50)
    • 插入计算列(由@Nick.McDermaid指出)
    如果您的数据库使用引用完整性,您也可能会遇到引用完整性问题(大多数情况下是这样的)

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

    我要提出的另一个建议是,将DB1插入DB2中的“stage”表中。这些表不应具有关系完整性,并允许您将流程分解为以下几个步骤

    • 将数据从DB1转移到DB2
    • 就与数据库/规则相关的问题生成报告/查询
    • 使用SQL将阶段表中的数据合并到目标表中
    最后一步是可以使用合并语句,或者根据密钥匹配使用简单的插入/更新。然后,在本地数据库中使用SQL就可以使用集合论来管理两个集合的重叠,并找出哪些是新的或要更新的

    SSIS“可以”做到这一点,但您将无法使用SSIS进行批量更新,而使用SQL则可以。SSI将执行所谓的RB