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

我有一个存储过程,调用其他人,其中之一是由于重复主键无法插入一行到表中

引发的错误是消息2627,级别14,状态1,过程…,第16行违反主键约束“…”。 不能在对象“…”中插入重复的键。

我通过VBA通过Excel电子表格调用这个函数,通常在On Error处理,但是这个例程在没有触发错误的情况下会自动失败。

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

有没有人经历过这样的事情,可以提出一个解决办法?

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

谢谢

在外部proc中添加一个显式的事务。 BEGIN TRANSACTION开始, COMMIT TRANSACTION结束。

然后在开始事务之前添加SET XACT_ABORT ON; 。 这将处理批次失败。

在内部过程出错后,检查语句级错误的错误值,例如

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

我们用T-SQL中的OUTPUTvariables来做到这一点,尽pipe我只知道它的SQL方面:你需要谷歌从SQL获取输出参数与VBA。 声明一个输出variables为一个varchar,并立即将其设置为“':

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

在T-SQL中进行正常的错误检查,如果发现错误,则将描述设置到@MyErrorvariables中。 你的VBA代码将总是得到@MyError消息,但是它通常是一个空string''。 如果不是,那么你去在VBA中的error handling。