Sql 如果值符合条件,是否在插入后更改列值?

Sql 如果值符合条件,是否在插入后更改列值?,sql,sql-server,triggers,Sql,Sql Server,Triggers,我以前在MSSQL中从未真正使用过触发器,但我认为这将是我完成这项任务所需要的 该表的结构如下: ID|****|****|****|****|****|****|****|TOUROPERATOR 旅行社代码告诉我们,我们为他们执行的航班属于哪家公司。其中两个代码(总共24个)已经过时。我们的用户要求更改这两个代码,但旅行社代码是从我们无法控制的数据库中提取的。然而,FlightData表是由我们控制的。所以我在想,如果触发器是两个过时代码中的一个,那么它可以将旅游经营者代码更改为插入时的正

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

该表的结构如下:

ID|****|****|****|****|****|****|****|TOUROPERATOR
旅行社代码告诉我们,我们为他们执行的航班属于哪家公司。其中两个代码(总共24个)已经过时。我们的用户要求更改这两个代码,但旅行社代码是从我们无法控制的数据库中提取的。然而,FlightData表是由我们控制的。所以我在想,如果触发器是两个过时代码中的一个,那么它可以将旅游经营者代码更改为插入时的正确代码

所以我走进了好的SQL管理工作室,要求制作一个触发器。它给了我一些示例代码,下面是我的伪代码:

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
我不太擅长这种类型的数据库编程,所以请原谅我的错误


我该怎么做呢?

您的误解是,触发器每插入一个值就运行一次—实际上,它每插入一条语句就运行一次,因此您可以并且将发现一次插入多行

您会发现插入的值位于伪表
inserted
,在本例中,它与
FlightData
表的结构相同。您可以针对它编写一个select语句,指定您想要的任何条件


但是,您的逻辑是什么还不清楚-您正在触发器中更新的
FlightData
表是否只有一行?是否使用最新插入的值更新表中的每一行?很难理解您现在要做的是什么,以及表和此触发器的用途是什么——更不用说如果一次插入多行,您想做什么了。

当插入的表包含多行时,您的代码将失败,因此请更改代码以处理整个插入的表

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

您可以将计算列添加到表中,而不是添加触发器。 然后,新列可以使用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)

这里是计算列的基础-

插入后为什么更新表的可能重复?为什么不在插入和插入正确的提供者代码之前处理旅行社操作员代码?因为代码是从我们无法控制的数据库中提取的。我们只能查看该数据库,无法对其进行操作。请阅读触发器并尝试编写代码,或者创建一个处理源数据的过程,更正所需内容并加载到持久性table@Vipar由于您控制FlightTable,并且必须在其中进行更新,因此我认为最好处理旅行社操作员代码并插入它,而不是先插入然后更新它。如果一个操作可以完成这项工作,则无需使用代码在多个位置进行更改。使维护变得容易。此外,触发器价格昂贵,除非没有其他方法或其他方法优于触发器,否则不建议使用。表FlightData有数十万行,但用户从该表中提取数据时,要求更改我们使用的两个旅行社操作员代码。然而,旅游运营商代码是从我们无法控制的外部数据库中提取的。我们不能操纵它。因此,我当时的想法是捕获一个insert并简单地更改巡更操作符代码,以便它们在FlightData表中正确显示。根据我收集的信息,我必须删除包含数据的列,然后在其旁边创建一个新列。\ux您可以保留TourOperator列,您可以添加另一个虚拟列(它们可以持久化)到将包含“clean”值的表,原始TourOperator值或新值。因此,我将查询计算列,而不是原始列,或者?是的,查询计算列,而不是TourOperator列。下面是一些很好的例子,好的。我想我会认为这是最好的解决办法。谢谢:)