如果值符合条件,则在 INSERT 之后更改列值?

Posted

技术标签:

【中文标题】如果值符合条件,则在 INSERT 之后更改列值?【英文标题】:Change column value after INSERT if the value fits criteria? 【发布时间】:2016-08-12 07:44:41 【问题描述】:

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

表格结构如下:

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

Tour Operator Code 是告诉我们哪个公司拥有我们为他们执行的航班的代码。其中两个代码(总共 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

我不太擅长这种类型的数据库编程,请原谅我的错误。

我该怎么做呢?

【问题讨论】:

How can I edit values of an INSERT in a trigger on SQL Server?的可能重复 插入后为什么要更新表?为什么不在插入和插入正确的供应商代码之前处理旅行社代码? 因为代码是从我们无法控制的数据库中提取的。我们只有对该数据库的查看访问权限,我们无法对其进行操作。 阅读触发器并尝试编写代码msdn.microsoft.com/en-us/library/ms189799.aspx 或者创建一个过程来处理源数据,更正需要的内容并加载到持久表 @Vipar 由于您控制 FlightTable 并且它是必须进行更新的地方,我认为处理旅行社代码并插入它比插入它然后更新它更好。如果一项操作可以完成这项工作,则无需在多个位置进行代码更改。使维护变得容易。触发器也很昂贵,除非没有其他方法或其他方式优于触发器,否则不建议使用。 【参考方案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

【讨论】:

据我所知,我必须删除这个充满数据的列,然后在它旁边创建一个新列._. 您可以保留 TourOperator 列,您正在向表中添加另一个虚拟列(它们可以持久化),其中将包含您的“干净”值,原始 TourOperator 值或新值价值。 所以我会查询计算列,而不是原始列? 是的,查询计算列而不是 TourOperator 列。这里有一些很好的例子,blog.sqlauthority.com/2016/04/27/… 好的。我想我会把它作为最好的解决方案。谢谢:)【参考方案2】:

您的误解是触发器在每个插入值运行一次 - 实际上它在每个插入语句运行一次,因此您可以并且会发现一次插入不止一行。

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

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

【讨论】:

FlightData 表有数十万行,但我们的用户在从该表中提取数据时要求更改我们正在使用的两个旅行社代码。然而,旅行社代码是从我们无法控制的外部数据库中提取的。我们无法操纵它。所以我的想法是捕获一个插入并简单地更改旅行社代码,以便它们在 FlightData 表中正确显示。【参考方案3】:

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

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

【讨论】:

以上是关于如果值符合条件,则在 INSERT 之后更改列值?的主要内容,如果未能解决你的问题,请参考以下文章

mysql 中怎么设置默认值为系统日期

基于 SQL Server 2008 中列值的内部联接

Python Pandas:如果条件为真,则将现有列值放入新列

如果它们与使用 vba 的条件匹配,则在列中查找最小值和中值

如果列值 id 与另一个表中的 ID 描述匹配,则在指定列中插入数据(规范化形式)

如果满足 for 循环中的条件,则在同一行中的其他单元格中获取值