2012-08-04 69 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 
相關問題