【问题标题】:Change value of inserted row's column with trigger使用触发器更改插入行列的值
【发布时间】:2016-07-22 15:15:49
【问题描述】:

我正在尝试使用此逻辑编写触发器:

插入后,如果某列='Fprice_bat',则将不同列的值改为'0000'。

到目前为止,我所写的内容试图简单地向表中添加一条新记录,而不是更新插入的行。

我的查询现在看起来像这样。

CREATE TRIGGER [dbo].[TR_FixBatchTimes_I]
ON [dbo].[HEADER_BAT]
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE 
        @Starttime varchar(6),                      
        @Endtime varchar(6),                        
        @Batchstate varchar(30),                    
        @Batchtype varchar(30)                                                      

    SELECT
        @Starttime = F908,                          
        @Endtime = F910,                            
        @Batchstate = F914,                         
        @Batchtype = F916   
    FROM 
        inserted

    IF @Batchtype = 'FSPRICE_BAT'  
    BEGIN 
        INSERT INTO HEADER_BAT (F908, F910, F914)
        VALUES (0000, 2359, 'WAIT')
    END

我想我的错误是因为我正在调用“插入到 header_Bat”,它应该说一些类似于插入到插入的行...但是这种语法是不正确的。

如何让这个查询编辑插入的行而不是向表中添加新记录?

【问题讨论】:

  • 将其更改为before 触发器。您可以在将值插入表之前对其进行修改。
  • 使用INSTEAD OF 触发器
  • if a certain field = 'Fprice_bat' change the value of a different field to '0000' 插入不会更改任何值,它们只是插入新记录,您的问题对我来说没有多大意义。能否请您解释的更清楚一点。
  • 另外,您的触发器有一个重大缺陷。它假定插入时只会插入一行。在 sql server 触发器中,每个操作触发一次,而不是每行触发一次。您需要根据触发器设置。当您使用标量变量然后做出决定时,您就是在制造错误。

标签: sql sql-server triggers


【解决方案1】:

您的第一个错误是假设只插入单行。所有 DML 操作都是 set 操作。因此,如果您想更新某些内容,请使用集合。

CREATE TRIGGER [dbo].[TR_FixBatchTimes_I]
    ON  [dbo].[HEADER_BAT]
    AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;
    update HEADER_BAT
      set F908='0000', F910=2359, F914='WAIT'
    from HEADER_BAT h
         inner join inserted i on h.id = i.id --or what is PK
    where i.F916 = 'FSPRICE_BAT'
END

【讨论】:

  • 这看起来有效。我很确定我也遵循你的逻辑。谢谢。
【解决方案2】:

我不完全理解您的逻辑,但我认为您想根据 F916 列中传递的内容更改插入到 F908 列中的值。

CREATE TRIGGER [dbo].[TR_FixBatchTimes_I]
ON  [dbo].[HEADER_BAT]
INSTEAD OF INSERT
AS
BEGIN
 SET NOCOUNT ON;

    INSERT INTO HEADER_BAT (F908, F910, F914)
    SELECT
        CASE WHEN F916 = 'FSPRICE_BAT' THEN '0000' ELSE F908 END
       ,F910  -- Hardcode the value to 2359 or use from inserted
       ,F914  -- Hardcode the value to 'WAIT' or use from inserted
    FROM inserted
END

【讨论】:

    猜你喜欢
    • 2013-11-30
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    相关资源
    最近更新 更多