2011-01-05 30 views
0

我需要将3000个奇数行从一个SQL Server实例复制到另一个SQL Server实例。使用SSIS在SQL Server之间复制数据

目的地有现有的数据,由现场网站使用。

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

我想要实现的是,如果无论出于什么原因SSIS失败,目标表不会留空,从而打破我们的外部网站的功能。

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

更新: 感谢那些谁指出,“替换”没有任何意义 - 这是从以前的尝试,我们有我们所用的复制对象函数。

目前使用复制,它将放入3000行,但下一次运行时,它会再次放入相同的3000行!我需要的发生是有以下

  • 保留现有的目标数据的情况下,一些地方安全出了问题
  • 截断目标表
  • 复制过来的数据从源
  • 如果有什么做出错,截断目标表并导入备份的数据。

在SSIS中这样做的最好方法是什么?

感谢

格雷姆

+1

你是什么意思'使用替换'将其导入到目标表中?你能为每一步提供一些DDL来展示你在做什么吗? – Kenneth 2011-01-05 17:20:29

+0

我已经更新了这个问题,我错误地说它是一个替换,因为这是我以前尝试的东西 – Graeme 2011-01-06 08:59:32

回答

0

我有一个任务失败(PK违反,例如)和复制的行不会回滚,我已经重新开始任务之前将其删除。

您应该测试它。

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

您正在更换现有的行吗?更新现有的行?

1

这听起来像你正在寻找一个事务,如果有任何事情失败,它将回滚(撤消)。

这是全部或没有。

SSIS很好地处理交易。

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

一个重要的步骤有:

属性存在在封装 水平的的TransactionOption,容器水平(例如For循环, 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 
0

取而代之的是杀和填充策略,考虑合并数据。

  • 让我们叫你的原始表BASE
  • 与设置为原始
  • 截断同一列来自STG任何新数据创建STG表,并导入到STG
  • 更新BASE(由加盟商键)
  • 插入到从STG BASE其中不存在

这种方法具有零停机时间和无缝INTE的优点格雷申。

相关问题