列值更改的 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 时,带有 -1second_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) 触发器,在插入的主要内容,如果未能解决你的问题,请参考以下文章

基于列值变化的 T-SQL 递增计数器

当列值更改时,如何将组号添加到 SQL Server 2012 中的顺序记录?

在 SQL Server 2005 的查询中与 T-SQL 进行数据比较

SQL Server用逗号分隔[重复]

SQL Server 之T-SQL语言的学习

八SQL Server(T-SQL)数据语言操作