列值更改的 T-SQL (SQL Server 2016) 触发器,在插入
Posted
技术标签:
【中文标题】列值更改的 T-SQL (SQL Server 2016) 触发器,在插入【英文标题】:T-SQL (SQL Server 2016) trigger for column value alter, at Insert 【发布时间】:2017-02-15 18:09:43 【问题描述】:我正在处理我的一个 SSIS 项目。我已经成功地将一些 csv 加载到我的数据库中(通过 VS 中的集成服务),现在我正在尝试在数据库中创建一个触发器。
我想要发生的只是:当 second_road_class
列的编号为 -1 时,我希望它变为 6。我希望在插入期间触发触发器。
我的触发代码似乎在 SSMS 中调试正常!但是,当我稍后尝试再次插入 csv 时,带有 -1
的 second_road_class
列保持不变。
触发码:
CREATE TRIGGER AccidentsTrigger
ON [Accidents]
INSTEAD OF INSERT
AS BEGIN
SET NOCOUNT ON
IF (SELECT [second_road_class] FROM INSERTED) LIKE '-1'
BEGIN
UPDATE [Accidents]
SET [second_road_class] = '6'
WHERE [second_road_class] = '-1'
END
END
感谢您的帮助。
【问题讨论】:
这不起作用 -INSTEAD OF
真正的意思是 INSTEAD OF
- 因为触发器首先触发,所以没有要更新的行(除非您自己在扳机)。 “编译好了!”或“它没有让调试器出错”~= 按预期工作。
我真的尝试了很多解决方法。现在我正在研究下面的答案
【参考方案1】:
您可以使用after insert
触发器来执行此操作。
create trigger accidentstrigger on [accidents]
after insert as
begin;
set nocount on;
if exists (select 1 from inserted where [second_road_class] = '-1')
begin;
update a
set [second_road_class] = '6'
from [accidents] as a
inner join inserted i
/* change AccidentId to the Primary Key on accidents*/
on a.AccidentId = i.AccidentId
and i.[second_road_class] = '-1';
end;
end;
go
在 rextester 上使用 pilots
表的示例:http://rextester.com/XKX10184
【讨论】:
还是什么都没有。我将 CSV 加载到带有数据流的 VS IS 的数据库中是否存在问题? 似乎必须对包设置进行一些调整。现在它起作用了。感谢您的帮助! 显然还有一些我无法处理的事情。触发器为多行返回以下错误(但对于单行插入工作正常)Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
@MrDiaman 我不认为错误来自上面的触发器,因为没有返回任何值的子查询。检查插入语句或其他使用可能返回多个值的子查询的触发器。以上是关于列值更改的 T-SQL (SQL Server 2016) 触发器,在插入的主要内容,如果未能解决你的问题,请参考以下文章
当列值更改时,如何将组号添加到 SQL Server 2012 中的顺序记录?