2017-08-04 15 views
1

EquipmentStatKeyが何かから設定値に変化したときに変数を更新または連結するトリガーを作成しようとしていて、EquipmentStatKeyとUserDef2の両方が変更されたときに値を変更します。特定のタプルが更新されたときに実行されるトリガー

私はSQLに非常に慣れていて、何が間違っているのか分かりません。私が与えたエラーコードはSQL80001とSQL46010ですが、多分もっと複雑な構文/ロジックエラーがあると思います。

GO 

CREATE OR REPLACE TRIGGER equipStatTrig 
AFTER UPDATE OF EquipmentStatKey ON dbo.Equipment 
FOR EACH ROW 

AS 

DECLARE @statVar INT, @departmentVar INT, @receiveDateVar NVARCHAR (30), @shipDateVar NVARCHAR (30), @rentDateVar NVARCHAR (30), @sellDateVar NVARCHAR (30), @notesVar NTEXT 

SELECT @statVar = EquipmentStatKey 
SELECT @departmentVar = DeptOwnerKey 
SELECT @receiveDateVar = UserDef1 
SELECT @shipDateVar = UserDef2 
SELECT @rentDateVar = UserDef3 
SELECT @sellDateVar = UserDef6 
SELECT @notesVar = Notes 

/* execute if EquipmentStatKey changed from something to 6, 1, 8, or 32 */ 
IF @statVar = 06 OR @statVar = 01 OR @statVar = 08 OR @statVar = 32 
    BEGIN 
      /*should read as "[previous note] [status] [department] [date]" */ 
      SET @notesVar += ' ' + @statVar + ' ' + @departmentVar + ' ' + CurrentDate 
      SELECT LEN(@notesVar) AS Notes 
    END 
/* execute if EquipmentStatKey changed from something to 3 or 2 */ 
ELSE IF @statVar = 03 OR @statVar = 02 
    BEGIN 
      SET @shipDateVar = NULL 
    END 
/* execute if EquipmentStatKey changed from something to 6 */ 
ELSE IF @statVar = 06 
    BEGIN 
      SET @shipDateVar = CurrentDate 
      SET @sellDateVar = CurrentDate 
    END 
/* execute if EquipmentStatKey changed from something to 8 or 1, && UserDef2 changed */ 
ELSE IF @statVar = 08 OR @statVar = 01 AND :OLD.UserDef2 != :NEW.UserDef2 
    BEGIN 
     SET @rentDateVar = @shipDateVar 
    END 
GO 
+2

@Joshua Gregoryのスタックオーバーフローへようこそ。 SQL Serverを使用していますか? [windows-server-2016]ではなく、そのタグを付けるつもりでしたか?正確なタグを持つことで、これらのトピックで最も経験豊富なユーザーがあなたの質問を見つけるのに役立ちます。 – Degan

+0

これは間違いなくSQLサーバーにあると思われましたが、私が作ったときに誤ってオラクルを参照していたかもしれません...はい、私は知っています。 ( –

+1

)SQL Serverでは、行ごとにROW TRIGGERSをサポートしていませんが、STATEMENT TRIGGERSのみがサポートされています。INSERTEDおよびDELTED仮想テーブルの複数の行を処理する必要があります(https://docs.microsoft.com/en-us/) sql/t-sql/statements/create-trigger-transact-sql –

答えて

0

dbo.EquipmentはPKの主キーを持っていると仮定すると、私はあなたがこのような何かを探していると思う:

IF EXISTS 
(
    SELECT * 
    FROM sys.triggers 
    WHERE name = 'equipStatTrig' 
) 
BEGIN 
    EXEC('DROP TRIGGER dbo.equipStatTrig') 
END 
GO 

CREATE TRIGGER dbo.equipStatTrig On dbo.Equipment 
AFTER UPDATE 
AS 
BEGIN 
    UPDATE realTable 
    SET lastEquipmentStatKeyChangeDate = GETUTCDATE() 
    FROM 
     dbo.Equipment realTable 
     JOIN inserted ins 
      ON ins.PK = realTable.PK 
      AND ins.EquipmentStatKey <> realTable.EquipmentStatKey 
END 
GO 

EquipmentStatKey <> NULLはないが返されますので、あなたがNULLのEquipmentStatKeyを処理する方法が必要になる場合がありますtrueの場合は、ANSI_NULLSがOFFに設定されています。

関連する問題