【发布时间】:2015-10-30 08:33:13
【问题描述】:
我希望将这个列 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
)
【问题讨论】:
-
为什么不只有一个计算列?实际上,您的触发器已损坏,因为它假定
inserted恰好包含 one 行。通常情况并非如此。应编写触发器以处理包含 0、1 或 许多 行的inserted(和deleted)。 -
确实如此。删除你的专栏并使用
ALTER TABLE CurrentApplication ADD NoOfDays AS (coalesce(DATEDIFF(day, StartDate, EndDate),0)+1) PERSISTED,你应该有一些有用的东西。 -
@MattGibson 嗨!我试过这个但我得到了错误:无法在/使用表'CurrentApplication'上执行CREATE COLUMN,因为该表是目标表或当前正在执行的触发器的级联操作的一部分。
-
您是否尝试将 ALTER TABLE 语句放入触发器中?我们建议使用计算列而不是 触发器。删除您的
NoOfDays列,然后运行该单行代码一次,将其重新创建为计算列,应该是您需要的一切。不涉及触发器。
标签: sql-server triggers insert identity