3

我想知道是否有人能指出我正确的方向。这是我第一次尝试在 SQL 中进行任何类型的错误处理,我担心我要么完全遗漏了某些东西,要么误解了错误处理的概念。

我有一个程序,它基本上接受 3 个值,然后尝试查看其中一个值是否存在。如果是,则执行更新语句。

本质上,我想做以下事情: - 如果没有遇到错误,则返回“1” - 如果 Select 语句未能找到记录,则返回错误 - 如果 Update 语句未能更新任何记录,则返回错误

下面是我的程序。目前,每当我运行它时,它都会返回一个“1”,这表明没有错误,这不是我期望它工作的方式,因为我正在传递虚假值并试图破坏它。有人可以帮助指出我做错了什么,或者这是否可能?

alter PROCEDURE [dbo].prc_update_SPRO_refill_status                             
@result_code char(2),                             
@result_string char(10),                                                      
@rx_id char(20)        


AS                            
BEGIN                            


SET NOCOUNT ON; 
BEGIN TRANSACTION                                
BEGIN TRY   

DECLARE @prescription_orders_id varchar(20)
DECLARE @ErrorVar INT;
DECLARE @RowCountVar INT;

IF @result_code = 0
BEGIN
SELECT @prescription_orders_id = prescription_orders_id
FROM prescription_orders
WHERE rx_external_id = @rx_id
       -- Return error if record not found

UPDATE prescription_orders_fills
SET fill_status_code = 'R'
WHERE prescription_orders_id = @prescription_orders_id
    AND fill_status_code = 'P'
    AND fill_number > 1 
      -- return error if record not found
      -- return error if more then 1 record update


END                                               
END TRY
BEGIN CATCH
SELECT
    ERROR_NUMBER() AS ErrorNumber
    ,ERROR_SEVERITY() AS ErrorSeverity
    ,ERROR_STATE() AS ErrorState
    ,ERROR_PROCEDURE() AS ErrorProcedure
    ,ERROR_LINE() AS ErrorLine
    ,ERROR_MESSAGE() AS ErrorMessage;
IF @@TRANCOUNT > 0
    ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRANSACTION
 SELECT 1 as ERROR_NUMBER   
END                                                       
END 
4

2 回答 2

2

我认为这里的问题很简单:当没有引发异常时,您期望TRY失败并撞到块中。CATCH想一想:以下查询是否仅仅因为没有更新行而引发错误?

CREATE TABLE #foo(a INT);

UPDATE #foo SET a = 1 WHERE a = 2;

这里没有错误信息,所以没有理由CATCH被触发。如果你想测试你的错误处理,把一个真正的错误条件放在那里。例如:

BEGIN TRY
  IF @force_error = 1
  BEGIN
    SELECT 1/0;
  END
END TRY
BEGIN CATCH
  -- now you should get here...
END CATCH

同样正如我在评论中提到的 - 用于RETURN将错误号/状态代码发送回调用者。没有理由调用记录集返回单个标量值所需的所有脚手架。

于 2013-04-22T21:14:59.710 回答
0

我的 2 美分

alter PROCEDURE [dbo].prc_update_SPRO_refill_status                             
@result_code char(2),                             
@result_string char(10),                                                      
@rx_id char(20)        


AS                            
BEGIN                            


SET NOCOUNT ON;

设置 XACT_ABORT 开// 1 , 最好在尝试之前实现这个

BEGIN TRY   
BEGIN TRANSACTION  ; **// 2 start transaction after try**

DECLARE @prescription_orders_id varchar(20)
DECLARE @ErrorVar INT;
DECLARE @RowCountVar INT;

IF @result_code = 0
    BEGIN
        ...
        ...
        ...
        ...  
    END                          

END TRY
BEGIN CATCH
    SELECT
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
END CATCH;

   IF @@TRANCOUNT > 0
    BEGIN
        COMMIT TRANSACTION;
        SELECT 1 as ERROR_NUMBER  ;
    END 

END 
于 2013-04-22T21:26:59.853 回答