Sql server 2005 用于更新插入表值的SQL Insert触发器

Sql server 2005 用于更新插入表值的SQL Insert触发器,sql-server-2005,insert,triggers,Sql Server 2005,Insert,Triggers,我想创建一个Insert触发器,更新所有插入行上的值。根据插入表中的另一列,如果这些值为null,则应从不同的表中获取新值 我试过: UPDATE INSERTED SET TheColumnToBeUpdated = ( SELECT TheValueCol FROM AnotherTable.ValueCol WHERE AnotherTable.ValudCol1 = INSERTED.ValueCol1 ) WHERE ValueCol IS NULL

我想创建一个Insert触发器,更新所有插入行上的值。根据插入表中的另一列,如果这些值为null,则应从不同的表中获取新值

我试过:

UPDATE INSERTED
SET TheColumnToBeUpdated = 
    (
    SELECT TheValueCol FROM AnotherTable.ValueCol
    WHERE AnotherTable.ValudCol1 = INSERTED.ValueCol1
    )
WHERE ValueCol IS NULL
但我得到了这个错误:

Msg 286, Level 16, State 1, Procedure ThisTable_INSERT, Line 15
The logical tables INSERTED and DELETED cannot be updated.

我应该怎么做?

您需要更新目标表,而不是逻辑表。不过,您可以加入逻辑表,以确定要更新哪些行:

UPDATE YourTable
SET TheColumnToBeUpdated = 
    (
    SELECT TheValueCol FROM AnotherTable.ValueCol
    WHERE AnotherTable.ValudCol1 = INSERTED.ValueCol1
    )
FROM YourTable Y
JOIN Inserted I ON Y.Key = I.Key
WHERE I.ValueCol IS NULL

您可以将触发器更改为插入而不是插入。这将允许您检查传入的值,如果需要,将它们替换为其他表中的值

CREATE TRIGGER CoolTrigger 
ON MyAwesomeTable 
INSTEAD OF INSERT
AS 
BEGIN  

INSERT MyAwesomeTable (TheValueCol)
SELECT ISNULL(INSERTED.TheValueCol, AnotherTable.TheValueCol) AS TheValueCol
FROM INSERTED
JOIN AnotherTable ON INSERTED.ValueCol1 = AnotherTable.ValueCol1

END
注意:INSTEAD OF触发器不会导致递归

insert into output  
(SELECT t1.ts - INTERVAL (SECOND(t1.ts)%10) SECOND,  
t1.ts - INTERVAL (SECOND(t1.ts)%10) SECOND + INTERVAL 10 SECOND ,sum(t1.data),   
FROM (select * from input   
where unix_timestamp(ts) >= unix_timestamp('2000-01-01 00:00:10')  
and unix_timestamp(ts) < unix_timestamp('2000-01-01 00:01:20')  
)
  as t1   
GROUP BY UNIX_TIMESTAMP(t1.ts) DIV 10 );
这就是我的输出表的来源。 因此,插入不是由值决定的


非常抱歉,我无法从这里访问我的帐户office,

如果您不打算将处理此问题的逻辑封装到存储过程中,那么比触发器更好的替代方法是使用默认约束:@OMG Ponies:Shimmy不能使用默认值,因为问题是:我知道这很旧!这不会更新表中的所有行吗?将以下内容添加到最后一个where子句将仅更新插入的行:and Y.Key=I.Key。@AndyKing JOIN inserted I ON Y.Key=I.Key将仅更新插入的行