Sql server 根据SQL Server代理作业上次运行的执行状态设置存储过程变量

Sql server 根据SQL Server代理作业上次运行的执行状态设置存储过程变量,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我有一个SQL Server作业LoadDataIntoSQLTable每天运行一次,它执行SPusp\u UpsertData CREATE PROCEDURE usp_UpsertData AS BEGIN BEGIN TRY BEGIN TRAN DECLARE @maxDate DATE /*If the job is running today i.e., on 24th November, then @maxDa

我有一个SQL Server作业LoadDataIntoSQLTable每天运行一次,它执行SPusp\u UpsertData

CREATE PROCEDURE usp_UpsertData
AS
BEGIN
    BEGIN TRY
        BEGIN TRAN
            DECLARE @maxDate DATE
            /*If the job is running today i.e., on 24th November, then @maxDate should be 23rd October*/
            SELECT @maxDate = DATEADD(dd, -1, DATEADD(mm, -1, GETDATE()))
        COMMIT TRAN
    END TRY
    BEGIN CATCH
        DECLARE @errorMsg NVARCHAR(MAX),
                @errorSeverity INT
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION
        SELECT @errorMsg = ERROR_MESSAGE(), @errorSeverity = ERROR_SEVERITY()
        RAISERROR(@errorMsg, @errorSeverity, 1)
    END CATCH
END
现在,如果作业昨天失败,那么我的@maxDate应该是:

/*If the job failed yesterday i.e., on 23rd November, then the @maxDate should be 22nd October*/
SELECT @maxDate = DATEADD(dd, -2, DATEADD(mm, -1, GETDATE()))
我通过在我的代码中包含一个IF来实现上述目标,如下所示:

CREATE PROCEDURE usp_UpsertData
AS
BEGIN
    BEGIN TRY
        BEGIN TRAN
            DECLARE @maxDate DATE
            /*If the job is running today i.e., on 24th November, then @maxDate should be 23rd October*/
            IF EXISTS(SELECT * FROM msdb.dbo.sysjobhistory h
                      INNER JOIN msdb.dbo.sysjobs s
                      ON h.job_id = s.job_id
                      WHERE s.name = 'LoadDataIntoSQLTable'
                      AND h.run_date = CONVERT(VARCHAR, GETDATE()-1, 112)
                      AND step_id = 1
                      and h.run_status = 0)
            BEGIN
                SELECT @maxDate = DATEADD(dd, -2, DATEADD(mm, -1, GETDATE()))
            END
            ELSE
                SELECT @maxDate = DATEADD(dd, -1, DATEADD(mm, -1, GETDATE()))
        COMMIT TRAN
    END TRY
    BEGIN CATCH
        DECLARE @errorMsg NVARCHAR(MAX),
                @errorSeverity INT
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION
        SELECT @errorMsg = ERROR_MESSAGE(), @errorSeverity = ERROR_SEVERITY()
        RAISERROR(@errorMsg, @errorSeverity, 1)
    END CATCH
END
现在,这一切都很好。但是,如果工作持续失败2-3天或更长时间怎么办?如果作业昨天和前天也失败了,那么我的@maxDate应该是10月21日,依此类推。我希望,我能够解释@maxDate的逻辑

如果作业持续失败超过1天,则需要帮助确定@maxDate


任何形式的帮助都将受到感激。提前感谢:)

“需要帮助确定@maxDate作业是否持续失败超过1天。”如果作业失败,它将显示在日志中;这是最好的办法。我还建议对SQL Server代理中的操作员进行设置,以便在发生故障时也能通知他们,这样您就可以知道并尽快解决故障。旁注:为什么要使用
RAISERROR
?(文档中)建议在新的开发工作中使用
THROW
。操作员已设置,如果出现故障,我们将收到通知。但在第二天,SP应该从上次执行的maxDate开始,以防失败。它需要自动完成,不需要手动干预,因此很少有其他逻辑,如插入/更新。发生故障时,需要在SQL Server代理历史记录中显示故障,这就是出现错误的原因。如果RAISERROR不存在,即使出现故障,作业也会成功完成。“出现故障时,需要回滚更改,这就是RAISERROR”回滚错误与
RAISERROR
无关的原因。请参阅中的第一条语句:“RAISERROR语句不支持SET XACT_ABORT。新应用程序应使用THROW而不是RAISERROR。”