2009-12-03 139 views
24

我想创建一个插入触发器,它可以更新所有插入行上的值(如果它们为空),则应根据插入中的另一列从新表中获取新值表。SQL插入触发器来更新INSERTED表值

我想:

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. 

我应该怎么办呢?

+0

如果你不打算封装在一个存储过程来处理这个逻辑,比触发一个更好的替代方法是以使用默认约束:http://msdn.microsoft.com/en-us/library/aa175912%28SQL.80%29.aspx – 2009-12-03 03:44:38

+0

我希望我可以使用默认值,但正如你可以看到我想更新我的表根据插入的行中的不同列,不适用于'默认' – Shimmy 2009-12-03 03:51:17

+1

@OMG小马:Shimmy不能使用默认的每个问题:http://stackoverflow.com/questions/1744455 – gbn 2009-12-03 08:18:02

回答

39

您需要更新目标表,而不是逻辑表。你加入与逻辑表,虽然,找出要更新的行:

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 
19

你可以触发更改为INSTEAD插页。这将让你检查传入的值,如果需要的话,用其他表中的值替换它们。

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触发器不会导致递归。

0
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); 

这是我的输出表来自哪里。 所以插入不是由值。

Im很抱歉,但我不能从这里(办公室)访问我的帐户,