2012-08-04 48 views
0

我有3个表作为测试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表需要更新,因为我有一个触发器。请在下面找到我使用的执行语句,只有产品ID 1在测试3表中更新。请帮我解决这个问题。 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 

回答

1

您的触发器是单行触发器。它需要根据插入的表格执行所有记录。

未经检验的,但你的更新触发shouuld是这个样子更新所有受影响的行:

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 
相关问题