经过一些建议。我正在使用SSIS \ SQL Server2014。我有一个每晚的SSIS包,该包将来自非SQL Server数据库的数据提取到单个表中(每次都将SQL表预先截断),然后从该表中提取以创建一个每日的csv文件。
展望未来,我只想每天将已更改的记录(即Deltas)提取到csv中。
什么是最好的方法?我曾考虑过在SSIS中使用CDC,但是由于每次在初始加载之前都将SQL表截断时,这是最好的方法吗?还是我需要在SQL中拥有一个初始加载的主表,然后导入到另一个表中,然后仅提取存在差异的地方?有关信息,SQL中的表包含一个主键。
我只想仔细检查一下,因为CDC假定表都在SQL Server中,而我的数据首先来自外部SQL Server。
感谢您的帮助。
答案 0 :(得分:2)
该表上的主键是您在此处的保存宽限期。显然,要将不同数据放入其中的SQL Server数据库将不会从一个表刷新到另一个记录已更改的下一个数据库中知道,但是如果您添加两个其他表,并用另一个列修改现有表,应该可以利用HASHBYTES来解决这个问题。
在此示例中,我将调用新表SentRows
,但实际上您可以使用更有意义的名称。我们将在旧表HashValue
中调用新列。
将列HashValue
作为varbinary
数据类型添加到表中。 NOT NULL
。
使用主表主键中所有列以及SentRows
列的列创建HashValue
表。
创建一个与主表在结构上相同的RowsToSend
表,包括HashValue
。
通过将HashValue
应用于表中的所有非关键列,修改查询以创建HASHBYTES
。 (这将是非常乏味的。很抱歉。)
发送完整的数据集。
现在将所有键值和HashValue
移到SentRows
表中。截断您的主表。
在下一次拉动时,将HashValue
中的键值和SentRows
与主表中的新数据进行比较。
主键匹配+哈希匹配=不变的行
主键匹配+哈希不匹配=更新了行
输入数据中的主键,但现有数据集中缺少主键=新行
主键不在传入数据中,而是在现有数据集中=已删除的行
拉出您需要发送到RowsToSend
表的所有更改。
从RowsToSend
发送更改。
将键值和HashValue
移动到SentRows
表中。更新散列以更改键值,插入新行,并决定如何处理删除(如果必须处理删除)。
截断SentRows
表以准备明天。
如果您愿意的话(稍后您会感谢您)将计算列添加到SentRows
表中,默认值为GETDATE()
,它将告诉您何时添加行
然后离开。从现在开始,只有三角洲。
编辑2019-10-31:
逐步(或TL; DR)
1)冲洗并填充MainTable
。
2)将MainTable
上的键和哈希与SentRows
上的键和哈希进行比较,以识别新行/已更改行。
3)将新行/更改的行移至RowsToSend
。
4)发送RowsToSend
中的行。
5)将所有行从RowsToSend
移到SentRows
。
6)截断RowsToSend
。