【发布时间】:2016-01-15 08:56:33
【问题描述】:
我有一个名为INVOICE 的表,它存储有关订单/订单的账单信息,该表中的一列是名为paid 的列,它是一种位。顾名思义,此列表示特定订单/订单账单是否已支付。
我有另一个名为 RECEIPT 的表,该表存储有关特定发票的任何付款流程的信息。
因此,每次用户为指定发票支付金额时,都会创建一个新的收据记录。
现在我要做的是创建一个触发器,更新 INVOICE 表中的 paid 列并将其设置为 1。如果收据总和属于发票等于INVOICE表中的amount_due。
换句话说,如果发票到期金额 = 100$
用户支付了 50 美元
然后,迟到了,他付了另外 50 美元
INVOICE 表中的paid 列应设置为 1,因为总付款等于发票到期金额
这是我为实现上述目的而创建的触发器
CREATE TRIGGER tg_invoice_payment ON RECEIPT
AFTER INSERT
AS
BEGIN
UPDATE INVOICE
SET paid = 1
WHERE INVOICE.invoice_id = (SELECT inserted.invoice_id FROM inserted)
AND (SELECT SUM(RECEIPT.amount_paid)
FROM RECEIPT
JOIN inserted ON RECEIPT.receipt_id = inserted.receipt_id
WHERE RECEIPT.invoice_id = inserted.invoice_id) = (SELECT INVOICE.amount_due
FROM INVOICE
JOIN inserted ON INVOICE.invoice_id = inserted.invoice_id
WHERE INVOICE.invoice_id = inserted.invoice_id)
END;
编译成功,但在运行时出现以下错误:
如果语句包含没有 INTO 子句的 OUTPUT 子句,则 DML 语句的目标表“RECEIPT”不能有任何启用的触发器
【问题讨论】:
-
问题出在您没有向我们展示的一段代码中,即执行
INSERT ... OUTPUT ...,并且,正如错误消息也指出(很清楚,IMO),它没有使用INTO. -
另外,你的触发器坏了。当
inserted包含多行时,INVOICE.invoice_id = (SELECT inserted.invoice_id FROM inserted)将产生错误。 -
收据表是否有自动递增的标识列?请参考:sql-server-helper.com/error-messages/msg-334.aspx
标签: sql-server