Sql server SQL触发器可以';我无法检测到我的身份栏

Sql server SQL触发器可以';我无法检测到我的身份栏,sql-server,triggers,insert,identity,Sql Server,Triggers,Insert,Identity,我想把这个列隐藏起来,我用它作为标识,这样当我的触发器更新一个列时,它就会知道更新哪个列,因为目前它不知道,所以每当我插入一个新记录时,触发器就会用新记录的值更新所有列的预期值。但它会返回错误 无法绑定多部分标识符“inserted.HiddenId” 触发器 CREATE TRIGGER InsertNoOfDays ON CurrentApplication AFTER INSERT AS BEGIN DECLARE @temp INT SELECT @temp = (coa

我想把这个列隐藏起来,我用它作为标识,这样当我的触发器更新一个列时,它就会知道更新哪个列,因为目前它不知道,所以每当我插入一个新记录时,触发器就会用新记录的值更新所有列的预期值。但它会返回错误

无法绑定多部分标识符“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
)
完全正常。 update语句未指定“插入的”表。
缺少语句“from inserted”。因此,找不到“inserted”。

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

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

我根本不会用扳机。在这种情况下,计算列可以很好地处理多行插入:

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

这将删除现有的
NoOfDays
列,然后用一个新的列替换它,该列在
StartDate
EndDate
发生更改时计算
NoOfDays
并将计算值与其他表数据一起存储以获得速度。

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

的确这也是一个提示,你需要考虑插入多行的情况,所以在<代码>插入的伪表中可能有不止一行。为什么不只有一个计算列呢?实际上,触发器被破坏,因为它假定插入的
只包含一行。通常情况并非如此。应该编写触发器来处理包含0行、1行或多行的
插入的
(和
删除的
)。删除列并使用
ALTER TABLE CurrentApplication ADD NoOfDays AS(coalesce(DATEDIFF(day,StartDate,EndDate),0)+1)持久化
,您应该有一些有用的东西。@MattGibson Hi!我尝试了此操作,但出现了错误:无法对/使用表“CurrentApplication”执行CREATE COLUMN,因为该表是目标表或当前执行触发器的级联操作的一部分。是否尝试将ALTER table语句放入触发器中?我们建议使用计算列而不是触发器。删除
NoOfDays
列,然后运行这一行代码,将其重新创建为计算列,这应该是您所需要的一切。没有涉及触发器。可能是重复的我尝试了这个,但我仍然得到相同的错误D:嗨!我尝试了此操作,但仍然出现错误无效列名D: