触发不会更新所有受影响的行
问题描述:
我有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
答
您的触发器是单行触发器。它需要根据插入的表格执行所有记录。
未经检验的,但你的更新触发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