Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 仅当源表数据更改时更新结果表_Sql_Sql Server_Tsql_Ssis - Fatal编程技术网

Sql 仅当源表数据更改时更新结果表

Sql 仅当源表数据更改时更新结果表,sql,sql-server,tsql,ssis,Sql,Sql Server,Tsql,Ssis,我们有一个结果表,其中包含来自5-6个源表的数据。数据每周显示一次。我们决定编写一个存储过程,并从SQL Server作业调用它,每周将数据拉入结果表 如果源表中的任何数据在一周内发生更改/更新,我们必须仅在结果表中更新这些记录。现在,我们正在考虑两种方法: 创建触发器,以便在同一周内源表中发生更改/更新时更新结果表 使用[modified date]列标识源表中已修改的记录,并在结果表中更新这些记录 我的问题是: 在SQL Server或SSI中,我们是否有其他轻量级方法可以做到这一点? 对于

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

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

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

使用[modified date]列标识源表中已修改的记录,并在结果表中更新这些记录

我的问题是:

在SQL Server或SSI中,我们是否有其他轻量级方法可以做到这一点? 对于每周将数据加载到结果表中,除了SQL Server或SSIS中的SQL Server作业之外,我们还有其他方法吗? 感谢您的帮助。

问题解答:

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

变更数据捕获略有不同,因此我几乎是这样写的。它的logreader或sp_ReplCmd使用内部函数调用来检测SQL Server始终记录的更改,这意味着CDC在性能影响方面相对较轻

对所考虑的方法的评论:

使用触发器时仔细测试性能和逻辑。触发 在事务范围内运行,因此它们会增加开销 影响事务性能,如果写入不正确,则 导致意外回滚。我更喜欢CDC而不是这种方法

而不是[修改日期],考虑添加一个 列添加到4-5个源表中的每个表。添加4-5个二进制8列 目标表或另一个 与目标表具有1:1的关系。添加4-5个选项中的每一个 源表的主键列与目标表或1:1 桌子插入源表的主键值及其 将行版本值导入目标表或1:1表。当 连接键值的rowversion值不同,源 表的行已被修改。当目标中缺少行时 表或1:1表中插入了一行 桌子我更喜欢CDC而不是这种方法


您只关心从一周到下一周的状态,还是需要捕获每周的所有更改?第一种方法更易于处理计划作业和每个表中的一列。第二个是触发器可以处理的事情。这取决于条款:有多少数据?它多久改变一次?读写平衡。。。有大量的数据。因为所有源表都是事务表,所以它会经常更改。我需要捕获所有数据更改。有人能告诉我,我们可以在SSIS中使用更改数据捕获来捕获这些场景吗?谢谢解决方案。但我对CDC的实施有疑问。我是否需要从源表中插入更新的行,并使用CDC将其更新到目标表中?您可以使用CDC来识别更改-无需更改现有源表,除非它们不明智地没有主键。如果不需要更改历史记录,请使用更改跟踪。两者都提供了识别行和列更改的函数。您可以使用这些函数为目标表开发/编写自己的insert、update或delete语句。由于源表未修改,CDC或CT可以轻松利用现有设计。如果表没有主键,请考虑创建一个替代身份属性的代理PK。