触发器不会更新所有受影响的行

本文关键字:影响 更新 触发器 | 更新日期: 2024-10-24 17:06:30

我有三个表作为测试1、测试2和测试3。

测试1,是一个销售表格。其中记录销售详细信息。并且它将生成销售id。

测试2是一个表,用于记录在这个特定的销售id中销售的所有产品。我正在使用openxml插入这些详细信息。请在下面找到用于更新测试1和测试2表的存储过程。

CREATE PROCEDURE UpdateSales
(
@SalesID int out,
@SalesDate Date,
@XmlString text
) 
AS
BEGIN
SET NOCOUNT ON
BEGIN TRANSACTION
BEGIN TRY
INSERT INTO Test1 (SalesDate) VALUES (@SalesDate);
SET @SalesID = SCOPE_IDENTITY();
DECLARE @XMLDocPointer int;
EXEC sp_xml_preparedocument @XMLDocPointer OUTPUT, @XmlString;
INSERT INTO Test2 (SalesID, ProductId, ProductName, qty)
    SELECT @SalesID, productId, productName, qty
    FROM OPENXML(@XmlDocPointer, '/Root/Products', 2)
    WITH (productId int,
        productName varchar(100),
        qty int);
EXEC sp_xml_removedocument @XMLDocPointer 
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
END
GO

表3是产品表。需要根据售出的产品更新数量。插入后,我在测试2表上使用触发器。请在下面找到使用的触发器。

CREATE TRIGGER updateQty ON Test2
AFTER INSERT
AS
DECLARE @productID int;
DECLARE @qty int;
SELECT @productID = ProductId FROM INSERTED;
SELECT @qty = qty FROM INSERTED;
DECLARE @currentQty int;
SELECT @currentQty = qty FROM Test3 WHERE productID = @productID;
UPDATE Test3 SET qty = @currentQty - @qty WHERE productID = @productID;
GO

当我尝试执行存储过程以将记录插入测试1和测试2表时,因为测试3表需要更新,因为我有触发器。请在下面找到我使用的execute语句,在测试3表中只更新了产品id 1。请帮我解决这个问题。提前tanx。

已执行语句。

EXEC UpdateSales 
'1' , '08/08/2012' , 
'
<Root>
<Products>
<productId>1</productId>
<productName>Product 1</productName>
<qty>1</qty>
</Products>
<Products>
<productId>2</productId>
<productName>Product 2</productName>
<qty>2</qty>
</Products>
<Products>
<productId>3</productId>
<productName>Product 3</productName>
<qty>3</qty>
</Products>
</Root> 
'
GO 

触发器不会更新所有受影响的行

您的触发器是单行触发器。它需要对插入表中的所有记录执行操作。

未测试,但您的更新触发器应该看起来像这样,以更新所有受影响的行:

CREATE TRIGGER updateQty ON Test2 
AFTER INSERT 
AS 
UPDATE Test3 
  SET qty = qty - i.qty
from test3 t
join inserted i on i.productid = t.productid
GO