SQL Trigger无法检测我的标识列

时间:2015-10-30 08:33:14

标签: sql-server triggers insert identity

我希望将此列HiddenID用作IDENTITY,以便当我的触发器更新列时,它将知道要更新哪个,因为当前它没有,所以每当我插入新记录时,触发器会更新它的假设对于具有用于新记录的值的所有列。但它返回错误

  

多部分标识符" inserted.HiddenId"无法受约束。

触发

CREATE TRIGGER InsertNoOfDays ON CurrentApplication
AFTER INSERT
AS
BEGIN
    DECLARE @temp INT
    SELECT @temp = (coalesce(DATEDIFF(day, StartDate, EndDate),0)+1) --Default 0
    FROM inserted

    UPDATE CurrentApplication SET NoOfDays = @temp WHERE CurrentApplication.HiddenID = inserted.HiddenId
END

表格

CREATE TABLE CurrentApplication
(
StartDate       datetime        ,
EndDate         datetime        ,
NoOfDays        integer,
StaffID         integer         ,
AppStatus       varchar(30)     DEFAULT 'PENDING',
HiddenID        integer         IDENTITY
)

4 个答案:

答案 0 :(得分:1)

完全正常。 您的更新语句未指定"插入"表。 声明"来自插入"不见了。因此,"插入"无法找到。

答案 1 :(得分:1)

我根本不会使用触发器。对于这种情况,计算列可以正常工作,并处理多行插入:

ALTER TABLE CurrentApplication DROP COLUMN NoOfDays;
ALTER TABLE 
    CurrentApplication 
    ADD NoOfDays AS (coalesce(DATEDIFF(day, StartDate, EndDate),0)+1) PERSISTED 

这会删除现有的NoOfDays列,然后将其替换为新的computed column,只要NoOfDaysStartDate更改,就会计算EndDate并存储计算出的值与其他表格数据一起提供速度。

答案 2 :(得分:0)

可能您正在寻找更新连接语法;像

UPDATE c
SET NoOfDays = @temp
FROM CurrentApplication c
JOIN inserted i
ON c.HiddenID = i.HiddenId;

答案 3 :(得分:0)

RMS是对的,你的触发器应如下所示:

CREATE TRIGGER InsertNoOfDays ON CurrentApplication
AFTER INSERT
AS
BEGIN
    UPDATE ca
    SET NoOfDays = (coalesce(DATEDIFF(day, i.StartDate, i.EndDate),0)+1) 
    FROM CurrentApplication ca
    INNER JOIN Inserted ON ca.HiddenID = i.HiddenId
END