【问题标题】:SQL Insert trigger to update INSERTED table values用于更新 INSERTED 表值的 SQL 插入触发器
【发布时间】:2009-12-03 03:36:40
【问题描述】:

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

我试过了:

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.

我该怎么做?

【问题讨论】:

标签: sql-server-2005 insert triggers


【解决方案1】:

您可以将触发器更改为 INSTEAD OF INSERT。这将让您检查传入的值,并在需要时将它们替换为其他表中的值。

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

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

    • (我知道这已经很老了!)这不会更新 YourTable 中的所有行吗?将以下内容添加到最后的“where”子句将仅更新插入的行:“and Y.Key = I.Key”。
    • @AndyKing JOIN Inserted I ON Y.Key = I.Key 将更新限制为仅插入的行/行
    【解决方案3】:
    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 );
    

    这是我的输出表的来源。 所以插入不是按值。

    很抱歉,我无法从这里(办公室)访问我的帐户,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      相关资源
      最近更新 更多