Sql server SQL触发器可以';我无法检测到我的身份栏
我想把这个列隐藏起来,我用它作为标识,这样当我的触发器更新一个列时,它就会知道更新哪个列,因为目前它不知道,所以每当我插入一个新记录时,触发器就会用新记录的值更新所有列的预期值。但它会返回错误 无法绑定多部分标识符“inserted.HiddenId” 触发器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
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: