1

我有一个存储过程,每晚都会由 windows 任务计划执行。关于存储过程的执行,我只需要知道以下 3 件事:
1. 任务执行的存储过程是按计划执行的吗?
2. 存储过程是否执行但有错误?
3、存储过程执行成功了吗?

我创建了一个表格来保存这些信息。该表有两个字段:日期时间和说明。

在我的存储过程结束时,我编写了一个插入语句,每次运行都会在我的表中插入一条记录(参见下面的代码)。但我需要定义两个插入(参见上面的第 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。

PS 此数据将显示在报告中:我将编写一个查询,该查询必须返回表中的所有数据 + 从开始到截止日期之间表中不存在的日期。

4

2 回答 2

2

你的程序应该有一个TRY/CATCH实现

http://msdn.microsoft.com/en-us/library/ms175976(v=sql.90).aspx

将整个过程逻辑包装在内部BEGIN TRY ... END TRY,并使用您的CATCH块在日志表中写入错误。成功的日志从TRY块的末尾写入。

RAISERROR如果您需要处理任何自定义错误检查并从过程内部的任何位置“跳转”到CATCH块,您还可以结合使用。

SQLFiddle 演示

于 2013-07-15T08:55:29.783 回答
0

您可以使用管理任务调度程序在特定时间执行存储过程。您必须首先为存储过程的执行定义一个任务。然后,当存储过程运行的指定时间或事件发生时,管理任务调度程序调用存储过程。

具体来说,管理任务调度程序执行以下操作:

管理任务调度程序连接到任务参数 DB2SSID 中指定的 DB2® 成员。如果管理任务调度程序无法建立连接,它将跳过存储过程的执行并将最后执行状态设置为 NOTRUN 状态。管理任务调度程序使用任务参数 procedure-input 中定义的 SELECT 语句从 DB2 检索存储过程的参数值。如果在管理任务调度程序检索这些参数值时发生错误,管理任务调度程序: 不调用存储过程。将任务的最后执行状态设置为 DB2 返回的错误代码。管理任务调度程序发出一条带有检索到的参数值和存储过程名称的 SQL CALL 语句。过程名称由任务参数procedure-schema 和procedure-name 连接而成。SQL CALL 语句是同步的,执行线程被阻塞,直到存储过程执行完毕。管理任务调度程序将最后执行状态设置为 DB2 返回的值。管理任务调度程序发出 COMMIT 语句。管理任务调度程序关闭与 DB2 的连接。

于 2013-07-15T08:45:33.553 回答