Tsql 接受参数并引发错误
我需要接受ProductID和DiscountPercent的参数,如果DiscountPercent的值为0,则会引发一个错误,但是当我检查代码时,输入负数时不会引发错误,我感觉我的传递参数有问题,因为我的raiserror单独工作Tsql 接受参数并引发错误,tsql,Tsql,我需要接受ProductID和DiscountPercent的参数,如果DiscountPercent的值为0,则会引发一个错误,但是当我检查代码时,输入负数时不会引发错误,我感觉我的传递参数有问题,因为我的raiserror单独工作 IF OBJECT_ID('spUpdateProductDiscount') IS NOT NULL DROP PROC spUpdateProductDiscount GO CREATE PROC spUpdateProductDiscount (@Prod
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
如果对象ID('spUpdateProductDiscount')不为空
DROP PROC SpUpdateProduct折扣
去
创建PROC spUpdateProductDiscount
(@ProductID INT,
@折扣百分比(整数)
像
开始
开始尝试
开始交易
更新产品集折扣百分比=折扣百分比
其中ProductID=ProductID;
提交事务
结束尝试
开始捕捉
如果@折扣百分比<0
开始
RAISERROR(N‘折扣百分比的值必须为正’,16,1)
回来
终止
端接
终止
似乎您相信捕获
块代码将始终执行。事实并非如此。仅当TRY
块中存在错误时,执行才会传递到CATCH
块
因此,要解决您的问题,您需要在@DiscountPercent<0开始时移动。。。在使用UPDATE
语句打开事务之前,结束对TRY
块的测试。然后,您需要在CATCH
块中添加一个额外的RAISERROR
语句来提升错误。或者,选择一个只显示它的/打印。请参阅有关该主题的任何示例
您可能会更好地处理未关闭的事务。您可以看到,如果UPDATE
语句失败,并且控制权被传递到CATCH
块,则事务保持打开状态。您也可以查看上面链接的页面,查看有关此的示例。按以下方式编写会有什么问题
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
CREATE PROC spupdateproduct折扣
(
@ProductID INT,
@折扣百分比
)
像
开始
如果@折扣百分比<0
开始
RAISERROR(N‘折扣百分比的值必须为正’,16,1)
终止
更新产品
设置折扣百分比=折扣百分比
其中ProductID=@ProductID;
终止
去
PS.RAISERROR
、GOTO
和FINALLY
是不推荐使用的。建议使用THROW
而不是RAISERROR
。也许有人可以在这里纠正我?@ckuhn203,SQL Server支持GOTO
。您可以使用该命令离开CATCH
块,并将执行传递给,例如FINALLY:
:-)我不知道@barthazar。谢谢SQL Server中没有FINALLY
构造,从技术上讲,也没有列出GOTO
和RAISERROR
,尽管Microsoft建议不要在新应用程序中使用这些构造。但是,我完全同意使用THROW
。@barthazar-谢谢,我不知道为什么我会觉得GOTO
不受欢迎。我故意不熟悉它,因为我认为它是EOL。