使用SSIS在SQL Server之间复制数据

时间:2011-01-05 17:17:58

标签: sql-server ssis

我需要将3000个奇数行从一个SQL Server实例复制到另一个SQL Server实例。

目的地包含现场网站使用的现有数据。

使用SSIS中的数据流,插入了一个Transfer,它使用SQL View从源中获取数据,然后将其导入目标表。这可确保数据在我们的外部网站上保持最新。

我想要实现的是,如果由于某种原因SSIS失败,目标表不会留空,从而破坏我们外部网站的功能。

由于包中只使用了一个任务,SSIS会使这个原子化吗?即如果它在复制数据时失败,它将不会使目标表空或部分完成?

更新 感谢那些指出“替换”没有意义的人 - 这是我们之前使用复制对象功能的尝试。

目前使用Copy,它会输入3000行,但是下次运行时,它会再次输入相同的3000行!我需要做的是拥有以下

  • 将现有目的地数据保存在安全的地方以防出现问题
  • 截断目标表
  • 复制来自源
  • 的数据
  • 如果出现任何问题,请截断目标表并导入备份数据。

在SSIS中执行此操作的最佳方式是什么?

3 个答案:

答案 0 :(得分:1)

听起来你正在寻找一个事务,如果一路上发生任何故障,它将回滚(撤销)。

全部或全无。

SSIS可以很好地处理交易。

This article描述了一种类似于你的情况,其中它通过删除一些行开始。

其中一个重要步骤是:

  

PackageOption属性存在于包中   水平,容器水平(例如For Loop,   Foreach循环,序列等)   就像任何控制流任务一样   (例如,执行SQL任务,数据流   任务等)。 TransactionOption可以   设置为以下之一:

* Required - if a transaction exists join it else start a new one
* Supported - if a transaction exists join it (this is the default)
* NotSupported - do not join an existing transaction

答案 1 :(得分:0)

我有一个任务失败(例如pk违规),并且复制的行不会被回滚,我必须在重新启动任务之前删除它们。

你应该测试它。

我不知道'替换'是什么意思。

你正在替换现有的行吗?更新现有行?

答案 2 :(得分:0)

考虑合并数据,而不是杀戮和填充策略。

  • 让我们称你的原始表BASE
  • 创建一个STG表,其列设置与原始
  • 相同
  • 截断并导入STG
  • 使用STG的任何新数据更新BASE(按业务键加入)
  • 从不存在的STG插入BASE

此方法的优点是零停机时间和无缝集成。