0

我有一种情况,每天都会加载一个事实表。

有两个 SSIS 包加载此表。

1) Package1_FullLoad.dtsx - 每周日运行,完全刷新

2) Package2_DailyLoad.dtsx - 除周日外,全天运行,仅删除和加载过去 14 天的数据。

现在,完整加载包 (Package1_FullLoad.dtsx) 有一个执行 SQL 任务,截断事实表中的所有行。

然后数据流从头开始加载事实表。

在这种情况下,事实表的标识值从 1 开始并以 1 递增,这很好,没有问题。

但是,对于每日加载包(Package2_DailyLoad.dtsx),在 DELETE 语句(仅删除过去 14 天的数据)之后,在 Execute SQL Task 中,我设置了以下代码:

DBCC CHECKIDENT('dbo.FactTable', RESEED,1) DBCC CHECKIDENT('dbo.FactTable', RESEED)

然后我运行数据流来加载数据,它只插入与过去 14 天对应的数据。

假设满载后事实表有10行(以为例更好地说明情况),今天删除3行,今天要插入5行(插入和删除由今天的每日加载包完成),新的标识值必须从 8 开始,到 12 结束。相反,我看到新的标识值从 11 开始,到 15 结束。

我在 SSIS 执行 SQL 任务中看不到此 DBCC 代码有任何影响。

此 DBCC 代码在数据库端的 SSMS 中运行良好。

关于如何解决这个问题的任何想法?

4

1 回答 1

0

您可以将标识列中的最大值存储在变量中,然后DBCC CHECKIDENT使用它执行,因为插入的下一行的标识列中的值将是 this 加上当前增量。例如

DECLARE @MaxID INT

SET @MaxID = (SELECT MAX(IdentityColumn) FROM dbo.YourTable)

DBCC CHECKIDENT ('dbo.YourTable', RESEED, @MaxID);
于 2018-10-12T15:00:52.080 回答