我需要接受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
答案 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。不推荐使用RAISERROR
,GOTO
和FINALLY
AFAIK。建议使用THROW
代替RAISERROR
。也许有人可以在这里纠正我?