Sql server 在存储过程中使用update语句进行问题测试错误处理

Sql server 在存储过程中使用update语句进行问题测试错误处理,sql-server,Sql Server,我无法理解为什么代码不起作用。vendorproducts表中有数据,但是执行后没有检索到数据,当我传入@vendorproducts=1 ALTER PROCEDURE HW5UD1 @vendor VARCHAR(64), @Perct DECIMAL(3,2) AS BEGIN TRANSACTION BEGIN TRY UPDATE VendorProducts SET paidPrice = paidPrice * (1 + @perct) W

我无法理解为什么代码不起作用。
vendorproducts
表中有数据,但是执行后没有检索到数据,当我传入
@vendorproducts=1

ALTER PROCEDURE HW5UD1
    @vendor VARCHAR(64),
    @Perct DECIMAL(3,2)
AS
BEGIN TRANSACTION
BEGIN TRY
    UPDATE VendorProducts 
    SET paidPrice = paidPrice * (1 + @perct)
    WHERE vendor = @vendor
END TRY
BEGIN CATCH
   ROLLBACK TRANSACTION
   PRINT 'Error occurred while trying to update vendor products table'
   RETURN -11001
END CATCH

COMMIT TRANSACTION

SELECT * 
FROM VendorProducts
WHERE vendor = @vendor

RETURN 0

评论太长了,让我们开始吧。首先,学会提问。您花了多长时间才显示任何错误消息?你发布的是完整的信息还是简略的版本

ALTER PROCEDURE HW5UD1
重新开始。这个名字没用。任何阅读您的代码(或调用此过程的代码)的人都应该通过阅读该名称了解您的过程的功能

让我们看看这个过程是怎么称呼的。您首先说您使用“@vendor=1”调用此过程。过了一会儿,你会说“供应商的意思是供应商的名字,比如DVD商场”。这里似乎有点不对劲。从模式的角度来看,从VendorProducts到VendorProducts应该有一个外键(FK)。你…吗?你有供应商的桌子吗?FK列是varchar还是numeric?由于传递的值为1,因此我希望为数值

接下来,您的过程包含一条DML语句。单个语句(在本例中为update)是原子语句,它要么成功,要么失败。没有必要进行交易。如果在调用此过程之前启动了事务,则现在您已无特殊原因嵌套了事务。更糟糕的是,您捕获任何错误,然后在抛出自己的错误时隐藏真正的错误。您只是通过隐藏使调试任何实际错误变得不可能。tsql中的错误处理很复杂-我建议您阅读一下

在CATCH子句中,使用print。不,不要。不要试图使用print从程序(或触发器)提供“输出”。它们以大多数调用者不期望也不会处理的方式返回给调用者(无论是完全返回还是按照开发人员的预期)。它们只是产生额外的工作。它可以用于调试目的,但不应出现在生产代码中。因为您抛出了一个错误,调用方隐式地知道“发生了错误…”-您的打印消息没有添加任何有用的内容

过程中的最后一条语句只是从尝试更新的表中选择行。为什么?如果调用方在调用时拥有所有这些信息,这只会创建额外的“工作”。如果调用者没有,那么为什么您认为调用者想要或需要这些信息。一般来说,你的程序应该做一件事。只需更新行即可

所以,也许这只是一个学习的练习。不幸的是,人们倾向于在没有太多解释的情况下提供工作代码。当然,你可以抄下来交个分数。但你不会学到很多东西(如果有的话),这是不幸的。没有理解和学习,你将无法发展成为一名有效开发人员所需的技能


最后,有许多关于tsql编码最佳实践的讨论。您应该阅读这些内容并开始实施

你能把你的代码格式化成可读的吗。在您过去的问题中,很多人都为您做过,但您不能一直期望其他人为您做。当然我会做。供应商的意思是供应商名称,如DVD商场,所以它是Varchar。那么,您为什么要设置
vendor=1
?这样它会返回在尝试更新供应商产品表时发生的错误,但不会返回错误。