Sql server 根据SQL Server代理作业上次运行的执行状态设置存储过程变量
我有一个SQL Server作业LoadDataIntoSQLTable每天运行一次,它执行SPusp\u UpsertDataSql 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
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。”