审计表的SSIS加载问题

问题描述 投票:0回答:1

我正在创建一个简单的SSIS增量加载,以了解这个过程,目前我的Audit表有一个问题。发生的情况是,加载会运行正常,并且在审计表中会从第一个执行任务中插入一条新的记录,但是当我在加载过程结束时去更新审计表中的AuditEndDate字段时,它只更新了表中的第一行。请往下看,供参考。

我的审计表包括; AuditID INT(主键) TaskID INT AuditStartDate DATETIME AuditEndDate DATETIME。

我的加载过程是成功的,并且工作。现在,我在加载开始时引入了一个SQL执行任务,该任务使用一个存储过程在审计表中插入一条新的记录,该记录有一个新的AuditID号和开始日期。在加载过程结束时,我有另一个SQL执行任务,它只是用GETDATE()更新同一行的AuditEndDate字段。

我使用的是OLE DB源

我的Load流程是这样的。

enter image description here

我的存储过程用于在第一个任务中插入审计表。

(
        @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 = ?

我在第一个执行任务中的参数设置是。

enter image description here

我在最后一个执行任务中的参数设置是;。

enter image description here

我的审计表是这样的。

enter image description here

如你所见,它只更新了第一行,而没有更新当前已创建的行。有人知道我做错了什么吗,请给我一些建议。

如果你需要更多的信息,请评论,我将协助。

非常感谢您 SM

ssis load
1个回答
1
投票

谢谢你提供的额外信息。

首先你插入了一个新的以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.

然后在更新任务时,将包参数引用改为你创建的本地变量,应该就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.