如果值符合标准,则在INSERT后更改列值?

时间:2016-08-12 07:44:42

标签: sql sql-server triggers

我之前从未在MSSQL中使用过触发器,但我认为这将是我完成此任务所需要的。

表的结构是这样的:

ID|****|****|****|****|****|****|****|TOUROPERATOR

旅游运营商代码是告诉我们公司拥有我们为他们执行的航班的代码。其中两个代码(共有24个代码)已过时。我们的用户要求更改这两个,但是旅行社代码是从我们无法控制的数据库中提取的。但是,我们确实控制了FlightData表。所以我认为触发器可以改变游程操作员代码,如果它是两个过时的代码中的一个,而不是分别在插入它们时改为正确的代码。

所以我进入了良好的'SQL Management Studio并要求触发器。它给了我一些示例代码,下面是我的伪代码:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER ChangeProvider 
ON  FlightData
AFTER INSERT 
AS  
BEGIN 
    IF(TheInsertedValue == Criteria)
        UPDATE FlightData
        SET TheInsertedValue = NewValue
    ENDIF
END  
GO

我对这种类型的数据库编程不太好,所以请原谅我的错误。

我将如何做到这一点?

3 个答案:

答案 0 :(得分:1)

您可以向表中添加计算列,而不是添加触发器。 然后新列可以使用case语句来显示 原始的TourOperator列值或您想要的新值。

您可以像这样添加一个新列

TourOperatorCorrect = CASE WHEN TourOperator = 'Whatever value' THEN     'ChangedValue'
                      --I just want to use what I have already in the TourOperator column
                      ELSE TourOperator 
                      END AS VARCHAR(50)

计算列的基础知识在这里 - https://msdn.microsoft.com/en-ie/library/ms188300.aspx

答案 1 :(得分:0)

你的误解是每个插入值触发器运行一次 - 实际上每个insert语句运行一次,所以你可以并且会一次找到多个行。

您会发现插入的值位于伪表inserted中,在这种情况下,它与FlightData表具有相同的结构。你写一个select语句,指定你想要的任何标准。

但是,它不能立即清楚你的逻辑是什么 - 你在触发器中更新的FlightData表只有一行吗?您是否使用最新插入的值更新表中的每一行?很难理解你现在正在尝试什么,以及表和这个触发器的用途是什么 - 更不用说如果你一次插入多行你想要做什么。

答案 2 :(得分:0)

当插入的表包含多行时,您的代码将失败,因此更改代码以使用插入的表作为整体

    UPDATE F
    SET f.TheInsertedValue = i.value
    from inserted i
    join
    Flighttable F
   on f.matchingcolumn=i.matchingcolumn
   and i.somevalue='criteria'