如何从VBA中的存储过程中的存储过程中捕获错误

时间:2012-04-19 16:57:10

标签: sql-server excel vba error-handling

我有一个存储过程调用其他几个,其中一个由于重复的主键而无法在表中插入行

引发的错误是 Msg 2627,Level 14,State 1,Procedure ...,第16行 违反PRIMARY KEY约束'...'。无法在对象'...'中插入重复键。

我通过VBA从Excel电子表格中调用它,并且通常使用On Error处理,但是例程在没有触发错误的情况下静默失败。

我不确定这是否存在于存储过程中的存储过程中,或者错误的严重程度是否过低。

有没有人经历过这样的事情,可以建议一个解决方法?

我最初的尝试是在存储过程调用周围放置一个BEGIN TRY / BEGIN CATCH块,CATCH以更高的严重性运行RAISERROR,但它似乎没有触发。

由于

2 个答案:

答案 0 :(得分:2)

在外部proc中添加一个显式事务。开头为BEGIN TRANSACTION,最后为COMMIT TRANSACTION

然后在开始事务之前添加SET XACT_ABORT ON;。这将解决批次故障。

在带有错误的内部proc之后,检查语句级别错误的错误值,例如

IF @@ERROR <> 0 
BEGIN
    ROLLBACK TRANSACTION; 
    RETURN 1; 
END

答案 1 :(得分:0)

我们使用T-SQL中的OUTPUT变量执行此操作,但我只知道它的SQL方面:您需要谷歌使用VBA从SQL获取输出参数。将输出变量声明为varchar,并立即将其设置为'':

DECLARE @MyError VARCHAR(500) OUTPUT
SET @MyError = ''

在T-SQL中执行正常的错误检查,如果发现错误,请在@MyError变量中设置描述。您的VBA代码将始终获取@MyError消息,但它通常是一个空字符串''。如果不是,那么您将在VBA中进行错误处理。