我如何只引入自上次sis运行以来已更改的行

时间:2018-07-30 12:15:41

标签: sql ssis

我有一个sis软件包,每小时运行一次,以带来销售。目前,我从业务开始就引入所有行,但只想引入新行和自上次运行以来已更改的行。我需要做的是以某种方式让sis创建一个最后运行的列,然后能够利用这段时间来筛选所有新的或已更改的行。不确定如何执行此操作,欢迎提出任何建议。

2 个答案:

答案 0 :(得分:2)

您查看了createdAtupdatedAt列,它们可能会使用触发器精心维护表中的所有行(尽管您也可以通过应用程序逻辑来完成)。

让我假设在创建行时设置了updatedAt。然后,您可以执行以下操作:

select t.*
from t
where t.updatedAt >= @LastReadDate;

答案 1 :(得分:0)

您可以使用Change Tracking检索自特定版本号以来对表所做的更改。这样可以捕获您无法通过审核列处理的删除。

所有SQL Server版本(甚至是Express)都提供更改跟踪,因此您不必担心许可问题。

从文档复制后,您可以使用:

加载自特定版本以来的所有更改。
SELECT  
    CT.ProductID, P.Name, P.ListPrice,  
    CT.SYS_CHANGE_OPERATION, CT.SYS_CHANGE_COLUMNS,  
    CT.SYS_CHANGE_CONTEXT  
FROM  
    SalesLT.Product AS P  
RIGHT OUTER JOIN  
    CHANGETABLE(CHANGES SalesLT.Product, @last_synchronization_version) AS CT  
ON  
    P.ProductID = CT.ProductID

@last_synchronization_version是ETL作业上次运行时使用的数据库版本。

有多种方法来获取最新版本。

一种方法是,在ETL作业开始到表中时,将当前版本号存储在CHANGE_TRACKING_CURRENT_VERSION()中,并用作下一次运行的@last_synchronization_version。第一次@last_synchronization_version0

您可以使用OLEDB命令同时从JobHistory表和当前版本中加载最后存储的版本:

select max(NextVersion) as VersionSince, CHANGE_TRACKING_CURRENT_VERSION() as NextVersion
from JobHistory;

并在软件包末尾存储下一个版本:

insert into JobHistory (...,NextVersion)
valures (...,@NextVersion)

这样,您可以轻松检索自上次运行以来所做的所有更改。

另一种选择是通过向查询中添加SYS_CHANGE_VERSION列来在结果中包括每一行的版本号

SELECT  
    CT.ProductID, P.Name, P.ListPrice,  
    CT.SYS_CHANGE_OPERATION, CT.SYS_CHANGE_COLUMNS,  
    CT.SYS_CHANGE_CONTEXT  ,
    CT.SYS_CHANGE_VERSION as TrackingVersion
FROM  
    SalesLT.Product AS P  
RIGHT OUTER JOIN  
    CHANGETABLE(CHANGES SalesLT.Product, @last_synchronization_version) AS CT  
ON  
    P.ProductID = CT.ProductID

每次运行时,您都可以从目标表中检索最大版本,并使用它从源中加载更改。

SELECT ISNULL(MAX(TrackingVersion),0) as LastVersion
From TargetTable 

另一种选择是每行存储整个数据库版本,而不是每行的版本。