我正在创建一个简单的SSIS增量加载,以了解这个过程,目前我的Audit表有一个问题。发生的情况是,加载会运行正常,并且在审计表中会从第一个执行任务中插入一条新的记录,但是当我在加载过程结束时去更新审计表中的AuditEndDate字段时,它只更新了表中的第一行。请往下看,供参考。
我的审计表包括; AuditID INT(主键) TaskID INT AuditStartDate DATETIME AuditEndDate DATETIME。
我的加载过程是成功的,并且工作。现在,我在加载开始时引入了一个SQL执行任务,该任务使用一个存储过程在审计表中插入一条新的记录,该记录有一个新的AuditID号和开始日期。在加载过程结束时,我有另一个SQL执行任务,它只是用GETDATE()更新同一行的AuditEndDate字段。
我使用的是OLE DB源
我的Load流程是这样的。
我的存储过程用于在第一个任务中插入审计表。
(
@TaskID INT
, @LoadStartDateTime datetime
, @LoadEndDateTime datetime
)
AS
BEGIN
SET NOCOUNT ON;
SET @LoadStartDateTime = ISNULL(@LoadStartDateTime, GETDATE())
-- Insert the log record
INSERT INTO [SM_SSIS_Audit_Log]
(
TaskID
, LoadStartDateTime
, LoadEndDateTime
) VALUES (
@TaskID
, @LoadStartDateTime
, @LoadEndDateTime
)
END
我的存储过程用于在最后一个执行任务中更新表。
(
@AuditID INT
)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
SET NOCOUNT ON;
UPDATE SM_SSIS_Audit_Log
SET
LoadEndDateTime = GETDATE()
WHERE
AuditID = @AuditID
SET NOCOUNT OFF;
END
我的插入的执行任务是
[SM_SSIS_LoadBegin] ?, NULL, NULL
我的更新的执行任务是
[SM_SSIS_TaskEnd] @AuditID = ?
我在第一个执行任务中的参数设置是。
我在最后一个执行任务中的参数设置是;。
我的审计表是这样的。
如你所见,它只更新了第一行,而没有更新当前已创建的行。有人知道我做错了什么吗,请给我一些建议。
如果你需要更多的信息,请评论,我将协助。
非常感谢您 SM
谢谢你提供的额外信息。
首先你插入了一个新的以TaskId加日期的行,然后你尝试更新以AuditId为键的行?现在的行为方式是因为它们是不同的值。正如你所看到的,插入时增加了一条新的记录,以0作为TaskId,然后你更新了一条记录,其中AuditId为键。然后你更新一条记录,其中AuditId为0。
看来AuditId是一个身份列,它是自己填充的。如果你想更新最新的AuditId,你应该在[SM_SSIS_LoadBegin]过程中使用@@IDENTITY或SCOPE_IDENTITY()输出它的值(更多信息在这里。https:/docs.microsoft.comen-ussqlt-sqlfunctionsidentity-transact-sql?view=sql-server-ver15。). 将此值保存到 局部变量 在SSIS中(而不是你所使用的封装参数,本地变量前缀为User::nnn),如这里所解释的。https:/dba.stackexchange.coma114831.
然后在更新任务时,将包参数引用改为你创建的本地变量,应该就可以了。