INSERT语句发生列不匹配时的SQL过程返回码

时间:2014-12-04 18:06:14

标签: sql sql-server tsql exception stored-procedures

我有一个'驱动程序'存储过程,它按特定顺序执行多个过程。在此驱动程序中有一些错误检查,它检查已执行过程的返回码,如果它不等于0则终止。下面是一些示例代码:

...
EXECUTE @return_status = data_validate

IF @return_status <> 0
BEGIN
    SELECT  return_status = 'FAIL',
            return_msg    = 'URS Data Validation Failed !!'
    PRINT  'Data validation failed!'
    RETURN 16
END
...

在此data_validate过程中,有一些表插入。在我完成data_validate之后,我意外地修改了其中一个表的结构。如果我重新编译了程序,它会给我一个错误,但从未发生过。所以下次这个驱动程序运行它执行data_validate时它会抛出以下错误:

  

Msg 213,Level 16,State 1,Procedure PERSONS_AFI,第19行   列名或提供的值数与表定义不匹配。

但是返回代码仍然是0,所以我的驱动程序继续并继续进行下一个程序。我知道这可能就是TSQL如何处理这种情况,但有谁知道为什么?即使程序中有错误,为什么返回代码仍为0?这似乎不对。我知道这个错误应该在编译时捕获,但是只在编译过程后修改了表。我怎么写这个驱动程序来捕获这样的错误?

谢谢!

编辑:这是一个庞大的系统,所以理想情况下我正在寻找对上面代码中错误捕获IF语句的一些小调整。我现在还不能真正重新做整件事。

1 个答案:

答案 0 :(得分:1)

如果SQL存储过程因非致命错误而失败,则可能未设置@return_status值且可能不为0 ...它可能为NULL。

您应该能够修改错误检查逻辑以添加NULL检查:

IF ISNULL(@return_status,1) <> 0

否则,您可以编辑存储过程以查找在INSERT,UPDATE和DELETE语句中出错后通常设置的@@ ERROR代码。

更新: 以下SQL都不会返回数据。对于NULL,您必须使用“IS NULL”和“IS NOT NULL”。或者专门处理NULL检查。

IF NULL = 0
    SELECT 1
IF NULL <> 0
    SELECT 1