我有一个存储过程,每晚都会由Windows任务计划执行。我只需要知道以下有关存储过程执行的3件事:
1.任务计划执行的存储过程是什么?
2.存储过程是否已执行但有错误?
3.存储过程是否成功执行?
我创建了一个表格来保存这些信息。该表有两个字段:Datetime和Description。
在我的存储过程结束时,我编写了一个insert语句,每次运行时都会将记录插入到我的表中(参见下面的代码)。但我需要定义两个插入(参见上面的第2和第3项),3(成功)或2(带错误)。数字1表示sp未执行,因此没有记录插入表中。我使用了以下语句,但它不起作用,因为当插入到表之前出现错误时,存储过程会停止,因此插入永远不会发生。
IF @@ROWCOUNT > 0 and @@ERROR = 0
BEGIN
insert into Table1
select GETDATE(), 'Successfully'
END
ELSE
insert into Table1
select GETDATE(), 'With errors'
你知道解决这个问题的好方法吗?我可以使用哪些语句来保存此表中的记录?
我正在使用SQL Server 2005。
P.S。这些数据将显示在一个报告中:我将编写一个查询,该查询必须返回表中的数据+表中不存在的日期和日期之间的日期。
答案 0 :(得分:2)
您的程序应该TRY/CATCH
实施
http://msdn.microsoft.com/en-us/library/ms175976(v=sql.90).aspx
将整个过程逻辑包装在BEGIN TRY ... END TRY
中,并使用您的CATCH
块在日志表中写入错误。成功的日志是从TRY
块的末尾开始写的。
如果您需要处理任何自定义错误检查并从过程内的任何位置“跳转”到CATCH
块,您还可以与RAISERROR
结合使用。
<强> SQLFiddle DEMO 强>
答案 1 :(得分:0)
您可以使用管理任务计划程序在特定时间执行存储过程。您必须首先为存储过程执行定义任务。然后,当指定的时间或事件发生以使存储过程运行时,管理任务调度程序将调用存储过程。
具体而言,管理任务调度程序执行以下操作:
管理任务调度程序连接到任务参数DB2SSID中指定的DB2®成员。如果管理任务调度程序无法建立连接,则会跳过存储过程的执行并将上次执行状态设置为NOTRUN状态。 管理任务调度程序通过使用任务参数procedure-input中定义的SELECT语句从DB2检索存储过程的参数值。如果管理任务计划程序检索这些参数值时发生错误,则管理任务计划程序: 不调用存储过程。 将任务的上次执行状态设置为DB2返回的错误代码。 管理任务调度程序使用检索的参数值和存储过程名称发出SQL CALL语句。过程名称从任务参数procedure-schema和procedure-name连接。 SQL CALL语句是同步的,执行线程被阻塞,直到存储过程完成执行。管理任务调度程序将上次执行状态设置为DB2返回的值。 管理任务调度程序发出COMMIT语句。 管理任务调度程序关闭与DB2的连接。