我之前从未在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
我对这种类型的数据库编程不太好,所以请原谅我的错误。
我将如何做到这一点?
答案 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'