2017-08-04 38 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

欢迎来到Stack Overflow,@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 /语句/创建触发件的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 

您可能需要一种方法来处理NULL的EquipmentStatKey因为EquipmentStatKey <> NULL将不会返回除非ANSI_NULLS为OFF,否则为true。