【发布时间】:2012-03-12 05:48:30
【问题描述】:
以下是删除发票的存储过程。一张发票包含一个或多个发票行,一个发票行包含一个或多个文章。
它是这样工作的:
- 发票行上的文章数在文章表(数量)中更新。
- 发票行被删除
- 发票已删除
以下表格受到影响:
- INVOICE - 包含 InvoiceID、Date、Paymentterms 和 CustomerID (fk)
- INVOICELINE - 包含 InvoicelineID、InvoiceID (fk)、ArticleID (fk)、数量、价格和折扣
- ARTICLE - 包含带有文章名称、数量、价格和折扣的文章。
下面是 SP,但由于某种奇怪的原因,我在运行它时出错(我要删除的发票当然存在)。有人能看出它有什么问题吗?
提前致谢!
ALTER PROCEDURE usp_DeleteInvoice
@InvoiceID int
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION;
WITH fr AS (
SELECT ArticleID, SUM(Quantity) AS ReclaimedQuantity
FROM Invoiceline
WHERE InvoiceID = @InvoiceID
GROUP BY ArticleID
)
UPDATE Article
SET Quantity = Quantity + fr.ReclaimedQuantity
FROM Article INNER JOIN
fr ON Article.ArticleID = fr.ArticleID;
DELETE FROM Invoiceline
WHERE InvoiceID = @InvoiceID;
DELETE FROM Invoice
WHERE InvoiceID = @InvoiceID; <- Error here
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
RAISERROR ('Couldn't delete invoice!',16,1)
END CATCH
END
GO
EXEC usp_DeleteInvoice 8
编辑: 我收到以下错误消息(第 36 行 = WHERE InvoiceID = @InvoiceID;):
- 子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
以下是发票表的结构(其中一张发票的编号):
- 发票 ID(PK,int):7
- 日期(日期):2011-01-01
- Paymentterms (tinyint) 30
- 客户 ID:1
【问题讨论】:
-
您遇到什么类型的错误?我知道你的 try/catch 块会阻止你看到它,所以你可能想尝试在没有这些块的情况下运行它以获得完整的错误消息。
-
那么所有关于存储过程做什么的详细信息,但对于实际出错的地方却一言不发?
-
@Jason 您的 Invoice 表的结构是什么?当您尝试运行它时抛出的错误是什么?
-
对不起,我已经添加了消息以及发票表的结构。
-
您在该过程中没有任何子查询...因此该错误消息毫无意义。您必须有某种引发该错误的触发器或检查约束。
标签: sql