我正在创建一个过程来从我的plants Table中删除一行。try and catch语句是要删除它,但如果plantID与任何植物都不匹配,则捕获错误并打印错误消息。然而,捕获不工作,我不确定如何修复它。
CREATE PROC spDeletePlant
@PlantID INT,
@PlantCode INT,
@PlantName VARCHAR(25),
@Description VARCHAR(50),
@ListPrice MONEY,
@BatchID INT,
@CategoryID INT
AS
BEGIN TRY
DELETE FROM Plants
WHERE PlantID = @PlantID
END TRY
BEGIN CATCH
THROW 50001, 'PlantID is incorrect.', 1
END CATCH;
请原谅我的格式,我是这个网站的新手。
不匹配任何行的查询不是错误-当您单独运行delete
语句时,您不会看到引发错误。
如果您想在没有删除行时自动抛出错误,您可以简单地执行:
DELETE FROM Plants
WHERE PlantID = @PlantID
IF @@Rowcount = 0
BEGIN
THROW 50001, 'PlantID is incorrect.', 1
END
您的代码正在工作,但没有按照您的期望执行。这是因为如果没有找到row, delete语句不会抛出任何错误。
你可以做的是:
- 执行先前的选择以查找被删除的寄存器,否则抛出错误。看@Stu的回答…
- 检查受影响的行变量。您使用的是哪个数据库?例如,在MSSQL中,您可以检查@@ROWCOUNT
PD:您确定要在找不到行时抛出异常吗?通常异常是为异常的事情保留的,比如I/O错误,坏参数等。
此外,您应该考虑异常开销,因此不是返回数据的好方法。
我认为您应该检查受影响的行数。