2009-12-03 30 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很抱歉,但我不能從這裏(辦公室)訪問我的帳戶,