2016-07-08 11 views
1

SQL Serverを初めて使用しており、ceu_amount列がゼロから任意の数値に更新されるたびにステージングテーブルに行を書き込む単純な更新トリガを構築しようとしていますゼロよりも。AFTER UPDATEトリガのSQL Server INSERT

PRINT文を使用することから、変数にINSERT文を実行するための正しい値が含まれていて、行が挿入されていないことがわかりました。

お手伝いできますか?

CREATE TRIGGER [dbo].[TRG_Product_Function_Modified] ON [dbo].[Product_Function] 
AFTER UPDATE 
AS 
BEGIN 
SET NOCOUNT ON; 

    -- 
    -- Variable definitions 
    -- 
    DECLARE @product_code_new as varchar(31) 
    DECLARE @product_code_old as varchar(31) 

    -- 
    -- Check if the staging table needs to be updated. 
    -- 
    SELECT @product_code_new = product_code FROM Inserted where ISNULL(ceu_amount,0) > 0; 
    SELECT @product_code_old = product_code FROM Deleted where ISNULL(ceu_amount,0) = 0; 
     IF @product_code_new IS NOT NULL 
     AND @product_code_old IS NOT NULL 
      INSERT INTO Product_Function_Staging VALUES (@product_code_new,CURRENT_TIMESTAMP); 

END; 

答えて

-2

コードのこの部分は、私には不審に見えるこの

CREATE TRIGGER [dbo].[Customer_UPDATE] 
     ON [dbo].[Customers] 
AFTER UPDATE 
AS 
BEGIN 
     SET NOCOUNT ON; 

     DECLARE @CustomerId INT 
     DECLARE @Action VARCHAR(50) 

     SELECT @CustomerId = INSERTED.CustomerId  
     FROM INSERTED 

     IF UPDATE(Name) 
     BEGIN 
       SET @Action = 'Updated Name' 
     END 

     IF UPDATE(Country) 
     BEGIN 
       SET @Action = 'Updated Country' 
     END 

     INSERT INTO CustomerLogs 
     VALUES(@CustomerId, @Action) 
END 
+0

OPのテーブルとカラムを参照するように編集することをお勧めします。また、 'if update'は更新の価値を気にせず、列が設定されているだけなので、これはとにかく動作するとは思いません。 –

0

を使用してみてください。..

SELECT @product_code_new = product_code FROM Inserted where ISNULL(ceu_amount,0) > 0; 
    SELECT @product_code_old = product_code FROM Deleted where ISNULL(ceu_amount,0) = 0; 
     IF @product_code_new IS NOT NULL 
     AND @product_code_old IS NOT NULL 
      INSERT INTO Product_Function_Staging VALUES (@product_code_new,CURRENT_TIMESTAMP); 

上記の更新のみ1行、どのような場合がある場合、正常に動作します複数の値があります。product_codeはデフォルト値の最終値になります

上記のコード部分を低

Insert into Product_Function_Staging 
select product_code ,CURRENT_TIMESTAMP from inserted where product_code is not null 
+0

チップをありがとう...それは働いている! – Bing

0

ceu_amount> 0で更新つ以上の行がある場合は、@product_code_newのため未定の値を取得します。 ceu_amountがNULLまたは等しい0で更新された複数の行がある場合は、@ product_code_oldと同様です。 サンプルデータを投稿できますか?

0

私はトリガでそのような変数を使用しません。なぜなら、トリガは更新されたテーブルと削除されたテーブルに複数の行を持つ複数の行への更新である可能性があるからです。

私はあなたが使用する一意のキーを持っていると仮定していますけれども、私は、我々はより安全かつ効率的に1つの単純なクエリで、この挿入を行うことができると思います。

CREATE TRIGGER [dbo].[TRG_Product_Function_Modified] ON [dbo].[Product_Function] 
AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO Product_Function_Staging 
    SELECT i.product_code, CURRENT_TIMESTAMP 
    FROM inserted i 
     JOIN deleted d ON i.product_code = d.product_code -- assuming product_code is unique 
    WHERE i.ceu_amount > 0 -- new value > 0 
     AND ISNULL(d.ceu_amount, 0) = 0; -- old value null or 0 
END; 

私はあなたがチェックする必要がどこかわかりませんあなたのデータにはnullがあるので、where句で推測しました。