【问题标题】:Trigger does not update all the rows affected触发器不会更新所有受影响的行
【发布时间】:2012-08-04 22:03:55
【问题描述】:

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

测试 1,是一张销售表。记录销售细节的地方。它会生成一个销售ID。

Test 2,是一个表格,用于记录在此特定销售 ID 中销售的所有产品。我正在使用 openxml 插入这些详细信息。请在下面找到用于更新 Test 1 和 Test 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 是产品表。根据售出的产品,数量需要更新。插入后,我在 Test 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

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

语句已执行。

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 

【问题讨论】:

    标签: c# sql-server-2008 openxml


    【解决方案1】:

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

    未经测试,但您的更新触发器应该如下所示以更新所有受影响的行:

    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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多