0

テスト 1、テスト 2、テスト 3 として 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

トリガーがあるためテスト3テーブルを更新する必要があるため、ストアドプロシージャを実行してテスト1およびテスト2テーブルにレコードを挿入しようとしたとき。私が使用したexecuteステートメントの下を見つけてください。Test 3テーブルで製品ID 1のみが更新されています。この問題を解決するのを手伝ってください。事前にt​​anx。

ステートメントが実行されました。

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 
4

1 に答える 1

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 
于 2012-08-04T13:56:08.157 に答える