我有一个sis软件包,每小时运行一次,以带来销售。目前,我从业务开始就引入所有行,但只想引入新行和自上次运行以来已更改的行。我需要做的是以某种方式让sis创建一个最后运行的列,然后能够利用这段时间来筛选所有新的或已更改的行。不确定如何执行此操作,欢迎提出任何建议。
答案 0 :(得分:2)
您查看了createdAt
和updatedAt
列,它们可能会使用触发器精心维护表中的所有行(尽管您也可以通过应用程序逻辑来完成)。
让我假设在创建行时设置了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_version
是0
。
您可以使用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
另一种选择是每行存储整个数据库版本,而不是每行的版本。