转换和复制表数据

时间:2015-04-24 15:29:54

标签: sql ssis sql-server-2008-r2

很抱歉,如果此问题被问过,但是我发布了,因为无法在论坛中找到任何相关信息。所以任何帮助将不胜感激。 这是我的情景。

我们有一个SQL表视图A(只是读取访问权限),其中包含位于域A上的服务器A上的数据集。 我们的SQL数据库与表B位于域B上的服务器B上。 我们在两个域之间打开了端口。

我们需要编写一个SSIS作业(每天运行),它将从View A获取数据并插入表B.那么可能是实现此目的的最佳方法。

注意:

  • table服务器上的视图没有已删除或上次修改的列 所以无法弄清楚有什么变化。 (如果还有其他方式请告诉我)
  • 数据库数据约为5万条记录

方法1:

  • 从View中导出数据
  • 转换它
  • 服务器B上的删除表
  • 插入转换后的数据

方法2:

  • 从视图中导出数据
  • 转换它
  • 插入临时表
  • 在日志表中创建日志条目
  • 当日志条目成功复制后,触发删除所有行并将数据从临时表复制到表B.
  • 如果出现问题,请回滚。

2 个答案:

答案 0 :(得分:0)

我建议在服务器B上的数据库B中应用新的登台表和历史表的第三种方法。登台表将主要镜像您的表B,但不包含任何约束,并且将有一个额外的位列定义状态。历史表将主要反映表B结构,但将包含两个附加列(ChangeDate和ChangeMade)。最后,对于这种方法,您需要确定用于将视图中的记录定义为唯一的列。

  • 截断登台表(来自之前的结果)。
  • 将数据从View(服务器A)导出到登台表(服务器B)。
  • 运行SQL任务以检查每条记录的一致性和质量。传递的记录,将状态位字段值设置为1,否则设置为0.
  • 在SQL任务中应用MERGE调用,以将数据从源(Staging表)转换为目标表(表B)并更新History表。这仅适用于Status = 1的那些记录。使用MERGE,您还可以将已更改内容的历史记录输出到新的历史记录表,其中“I”表示插入,“U”表示更新,“D”表示删除基于MERGE中定义的匹配。
  • 对于Staging表中值为0的记录,请向需要知道X号问题记录的人发送电子邮件。

这里的想法是该过程不会停止,如果找到一条坏记录,则不需要强制回滚。此外,您还可以通过查看Staging表来监视每日进程。我过去采用了这种方法,并将其集成到其中,发送电子邮件警报,其中包含SSRS报告的链接报告问题记录。这样做可以让我主动找到问题记录中的模式,并与我上游的人一起解决问题。如果视图提取了超过一百万条记录,那么您可能希望将一个代理键(设置为主要密钥)添加到Staging表中,其标识从1开始,并在每个新记录导入时自动递增1从视角来看。在运行MERGE之前,使用代理键设置聚簇索引。这将大大提高MERGE的性能。在第一步截断Staging表之前,删除索引。

希望这有帮助。

答案 1 :(得分:0)

只需通过创建具有三个语句的SQL存储过程即可实现此目的 - insert - 用于从A到B插入新记录 -Update - 更新在作业将每天运行之前复制的记录中发生的更改 -delete - 如果在A

中删除了任何记录,则删除B中的任何已删除记录

如果您需要对此解决方案有任何澄清,我会很高兴