Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 接受参数并引发错误_Tsql - Fatal编程技术网

Tsql 接受参数并引发错误

Tsql 接受参数并引发错误,tsql,Tsql,我需要接受ProductID和DiscountPercent的参数,如果DiscountPercent的值为0,则会引发一个错误,但是当我检查代码时,输入负数时不会引发错误,我感觉我的传递参数有问题,因为我的raiserror单独工作 IF OBJECT_ID('spUpdateProductDiscount') IS NOT NULL DROP PROC spUpdateProductDiscount GO CREATE PROC spUpdateProductDiscount (@Prod

我需要接受ProductID和DiscountPercent的参数,如果DiscountPercent的值为0,则会引发一个错误,但是当我检查代码时,输入负数时不会引发错误,我感觉我的传递参数有问题,因为我的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 
如果对象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。