【问题标题】:Error in stored procedure, but where?存储过程中的错误,但在哪里?
【发布时间】:2012-03-12 05:48:30
【问题描述】:

以下是删除发票的存储过程。一张发票包含一个或多个发票行,一个发票行包含一个或多个文章。

它是这样工作的:

  1. 发票行上的文章数在文章表(数量)中更新。
  2. 发票行被删除
  3. 发票已删除

以下表格受到影响:

  • 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


【解决方案1】:

查找一次只处理一条记录的错误写入触发器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2014-11-12
    相关资源
    最近更新 更多