仅在更改源表数据时更新结果表

时间:2015-09-17 03:05:47

标签: sql sql-server tsql ssis

我们有一个结果表,其中包含5-6个源表的数据。数据以每周显示。我们决定编写一个存储过程并从SQL Server作业调用它,以便每周将数据提取到结果表中。

如果在一周的时间内在源表中更改/更新了任何数据,我们必须仅在结果表中更新这些记录。现在我们正在考虑两种方法:

  1. 创建触发器,以便在同一周内在源表中发生更改/更新时更新结果表。

  2. 使用String[]列标识源表中的已修改记录,并在结果表中更新相同内容。

  3. 我的问题是:

    1. 我们是否有其他轻量级方法在SQL Server或SSIS中执行相同操作?
    2. 为了每周将数据加载到结果表中,除了SQL Server或SSIS中的SQL Server作业外,我们还有其他方法吗?
    3. 感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

问题答案:

  1. 考虑Change Data Capture
  2. Windows任务计划程序可以按计划运行可执行文件,例如sqlcmd.exe。并且有许多第三方任务/作业调度解决方案。
  3. SSIS使用SQL代理作业进行调度。最终,SSIS,作业和几乎所有解决方案都必须使用T-SQL来完成所需的工作。

    更改数据捕获略有不同(因此我写“差不多”的原因)。其logreader或sp_replcmds使用内部函数调用来检测(SQL Server始终记录的)更改,这意味着CDC在性能影响方面相对“轻量级”。

    对所考虑的方法的评论:

    1. 使用触发器时,请仔细测试性能和逻辑。触发器 在事务范围内运行,因此它们会增加开销 影响交易表现,以及(当写不正确时)可以 导致意外回滚。我赞成CDC这种做法。

    2. 考虑添加rowversion而不是[修改日期] 列到4-5个源表中的每一个。添加4-5个二进制(8)列 (每个rowversion一个)到目标表或另一个表 与目标表具有1:1的关系。添加4-5中的每一个 源表的主键列到目标表或1:1 表。插入源表的主键值及其值 rowversion值进入目标表或1:1表。当一个 联接键值的rowversion值不同,源 table的行已被修改。当目标中没有行时 表或1:1表,已将一行插入源 表。我赞成CDC这种做法。