接受参数并引发错误

时间:2014-05-03 18:05:31

标签: tsql

我需要接受ProductID和DiscountPercent的参数,如果为DiscountPercent的值,则引发错误,但是当我输入负数时检查代码时它不会引发错误,我感觉我的传递通过参数是问题,因为我的raiserror单独工作

IF OBJECT_ID('spUpdateProductDiscount') IS NOT NULL
DROP PROC spUpdateProductDiscount
GO

CREATE PROC spUpdateProductDiscount
(@ProductID INT,
@DiscountPercent INT)
AS
begin
BEGIN TRY
BEGIN TRANSACTION
update Products set DiscountPercent = DiscountPercent
WHERE ProductID = ProductID;
COMMIT TRANSACTION
END TRY

BEGIN CATCH
IF @DiscountPercent < 0 
 BEGIN
 RAISERROR(N'The value for DiscountPercent must be positive',16,1)
 RETURN
END
END CATCH
END 

2 个答案:

答案 0 :(得分:0)

您似乎相信CATCH块代码将始终执行。不是这种情况。只有当TRY块执行中出现错误时,才会将CATCH块传递给它。

因此,为了解决您的问题,您需要在打开IF @DiscountPercent < 0 BEGIN... END语句的事务之前将TRY测试移动到UPDATE块。然后,您需要在RAISERROR块中添加一个额外的CATCH语句,以提升错误。或者,SELECT / PRINT只会显示它。请参阅有关该主题的Technet's article上的任何示例。

您可能会更好地处理未结算的交易。您会看到,如果UPDATE语句失败并且控制权被转移到CATCH块,则事务仍然打开。您也可以检查上面链接的页面以获取相关示例。

答案 1 :(得分:0)

写下面会有什么问题?;

CREATE PROC spUpdateProductDiscount
(   
    @ProductID INT,
    @DiscountPercent INT
)
AS
BEGIN
    IF @DiscountPercent < 0 
    BEGIN
        RAISERROR(N'The value for DiscountPercent must be positive',16,1)
    END

    UPDATE Products 
    SET DiscountPercent = DiscountPercent
    WHERE ProductID = @ProductID;

END
GO

PS。不推荐使用RAISERRORGOTOFINALLY AFAIK。建议使用THROW代替RAISERROR。也许有人可以在这里纠正我?