2017-03-24 13 views
0

外部アプリケーションによって更新されるテーブルがあります。 トリガーを使用してSQL Serverの列を更新する

  • をOldReading

    • OldReadDate
    • MeterReading
    • ReadDate
    • MeterReading、ReadDateとConfirmReadingがアプリケーションによって更新され

    をConfirmReading:私は、次の列があります。 ConfirmReadingは、MeterReadingが許容範囲外の場合にのみ更新されます。

    は、私は次のことが起こる必要があります。MeterReadingとReadDateが表に更新され

    1)は、OldReadingとOldReadDateは、同じテーブル内のこれらの値で更新する必要があります。

    2)ただし、ConfirmReadingも更新されている場合は、 OldReadingは、代わりにこの値で更新する必要があります。

    3)上記の方法でOldReadingとOldReadDateを更新した後、MeterReading、ConfirmReadingとReadDateをそれぞれ0、0、NULLに設定する必要があります。

    これは私がこれまで持っているものです。

    CREATE TRIGGER [dbo].[Set_Old_Streetlight_Readings_to_New] ON [dbo].[M_FRSCHH_STRLGHT_METER] 
    
    AFTER UPDATE 
    AS 
    BEGIN 
    SET NOCOUNT ON 
        IF UPDATE(MeterReading) AND UPDATE(ConfirmReading) 
    
         BEGIN 
    
          UPDATE [dbo].[M_FRSCHH_STRLGHT_METER] 
    
           SET [OldReading] = [ConfirmReading], [OldReadDate] = [ReadDate] 
           WHERE ConfirmReading != 0 
         END 
    
    ELSE 
    
        IF UPDATE(MeterReading) 
    
         BEGIN 
    
          UPDATE [dbo].[M_FRSCHH_STRLGHT_METER] 
    
           SET OldReading = MeterReading, OldReadDate = ReadDate 
           WHERE ConfirmReading = 0 
    
         END 
    
        IF UPDATE(OldReading) 
         BEGIN 
    
          UPDATE [dbo].[M_FRSCHH_STRLGHT_METER] 
    
          SET MeterReading = 0, ConfirmReading = 0, ReadDate = NULL, ReadingPhoto = NULL, Reading_Flag = Null 
          WHERE MeterReading != 0 
        END 
    END 
    

    MeterReadingとの両方が更新を読む確認したときにそれは一種の作品だけでなく、場合MeterReadingアップデート。

    TIA、

    ジェイソン

  • +0

    コードはSQL Serverのように見えるので、私は、SQL Serverのタグを追加しました。 –

    +0

    最初に、トリガはすべての行を更新します(WHEREを考慮に入れます)。更新された行だけでなく正しいですか? – Serg

    +0

    次に、 'SET OldReading = ... IF UPDATE(OldReading)'は、DB上で許可されている場合、再帰をトリガするかもしれません。それが正しいか? – Serg

    答えて

    0

    私は、このコードは、すべての有益な何かをどうするか表示されません。 insertedまたはdeleted "テーブル"を使用していません。私は、行のデータにinsertedを一致させるために使用されているものの列を知らない

    CREATE TRIGGER [dbo].[Set_Old_Streetlight_Readings_to_New] 
        ON [dbo].[M_FRSCHH_STRLGHT_METER] 
        AFTER UPDATE 
    AS 
    BEGIN 
        SET NOCOUNT ON 
        IF UPDATE(MeterReading) AND UPDATE(ConfirmReading) 
        BEGIN 
         UPDATE [dbo].[M_FRSCHH_STRLGHT_METER] 
          SET [OldReading] = [ConfirmReading], 
           [OldReadDate] = [ReadDate] 
          FROM [dbo].[M_FRSCHH_STRLGHT_METER] lm JOIN 
           inserted i 
           ON lm.?? = i.?? 
          WHERE i.ConfirmReading = 0 
         END; 
        END; 
        . . . 
    END; 
    

    :私はこのような何かを期待します。

    +0

    こんにちはゴードン、ご感謝のおかげで。だから私はあなたが言うことを得るが、テーブルは削除または挿入されていない、それは常に更新されます。 MeterReadingとConfirmReadingの両方が更新されている場合、スクリプトは完全に機能します。 MeterReadingだけが更新されると失敗します。私はSQL Serverをかなり新しくしているので、やさしくしてください。 –

    +0

    @JasonPretorius。 。 。あなたのコードは 'M_FRSCHH_STRLGHT_METER'のすべての*行を更新しています。それは私には望ましくないようです。 –

    +0

    私はあなたのお勧めのコードに似ているように変更しましたが、今はあいまいさにいくつか問題があることに同意します。 –

    0

    まず、INSTEAD OFトリガーを使用して、より自然に要件に適合します。第二に、UPDATE()は、列が同じ値で更新されてもtrueを返します。あなたの物語からは、これはあなたが望むものではないと推測します。ここで

    は、サンプルのトリガーです:

    create trigger Set_Old_Streetlight_Readings_to_New 
    on dbo.M_FRSCHH_STRLGHT_METER 
    instead of update 
    as 
    begin 
    set nocount on 
    
    ;with x as (
        select 
         i.OldReading, 
         i.OldReadDate, 
         i.MeterReading, 
         i.ReadDate, 
         i.ConfirmReading, 
         d.OldReading d_OldReading, 
         d.OldReadDate d_OldReadDate, 
         d.MeterReading d_MeterReading, 
         d.ReadDate d_ReadDate, 
         d.ConfirmReading d_ConfirmReading 
        from inserted i 
        join M_FRSCHH_STRLGHT_METER d on i.<pk> = d.<pk> 
         and i.MeterReading <> d.MeterReading and i.ReadDate <> d.ReadDate 
    ) 
    update x 
    set 
        d_OldReading = case when OldReading <> d_OldReading then ConfirmReading else MeterReading end, 
        d_OldReadDate = ReadDate, 
        d_MeterReading = 0, 
        d_ConfirmReading = 0, 
        d_ReadDate = null 
    
    END 
    
    +0

    このコードを使用して実行すると「無効な列エラー」が表示されます。私はそれを作業の基礎として使用します。ありがとうございました –

    関連する問題