2

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

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

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

我不确定这是由于存储过程中的存储过程还是错误的严重性太低。

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

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

谢谢

4

2 回答 2

2

在外部过程中添加一个显式事务。BEGIN TRANSACTION在开始和COMMIT TRANSACTION结束时。

然后在开始交易之前添加SET XACT_ABORT ON;. 这将处理批处理失败。

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

IF @@ERROR <> 0 
BEGIN
    ROLLBACK TRANSACTION; 
    RETURN 1; 
END
于 2012-04-20T09:58:12.827 回答
0

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

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

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

于 2012-04-19T18:37:03.787 回答