我遇到的情况是每天都要加载事实表。
有两个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中正常工作。
关于如何解决此问题的任何想法?
答案 0 :(得分:0)
您可以将标识列中的最大值存储在变量中,然后使用此值执行DBCC CHECKIDENT
,因为插入下一行的标识列中的值将是此值加上当前增量。例如
DECLARE @MaxID INT
SET @MaxID = (SELECT MAX(IdentityColumn) FROM dbo.YourTable)
DBCC CHECKIDENT ('dbo.YourTable', RESEED, @MaxID);