【问题标题】:SQL Trigger can't detect my identity columnSQL 触发器无法检测到我的身份列
【发布时间】: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


【解决方案1】:

完全正常。 您的更新语句未指定“插入”表。 缺少“从插入”语句。因此,找不到“插入”。

【讨论】:

  • 确实如此。这也是一个提示,需要考虑插入多行的情况,所以inserted伪表中可能有不止一行。
【解决方案2】:

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

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

这会删除您现有的 NoOfDays 列,然后用新的 computed column 替换它,只要 StartDateEndDate 发生变化,它就会计算 NoOfDays,并将计算值与其他表数据一起存储以提高速度。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 嗨!我试过了,但我仍然收到错误无效的列名 D:
    【解决方案4】:

    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
    

    【讨论】:

    • 我试过了,但我仍然收到同样的错误 D:
    猜你喜欢
    • 1970-01-01
    • 2018-07-15
    • 2018-10-21
    • 1970-01-01
    • 2022-01-14
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多