我有一个'驱动程序'存储过程,它按特定顺序执行多个过程。在此驱动程序中有一些错误检查,它检查已执行过程的返回码,如果它不等于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语句的一些小调整。我现在还不能真正重新做整件事。
答案 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