SQL SERVER 触发器-改成成行级触发功能

近期第一次用SQL SERVER写触发器,发现SQL与ORACLE的触发器还是有区别的,最大区别:

(1)SQL只有语句级触发,没有行级触发;

(2)ORACLE有语句级触发和行级触发;

由于SQL没有行级触发,因此单独使用语句级来编写触发器会出现问题。为通俗易懂,举个例子:用SQL编写一个update触发器,在update数据时触发,若用以下语句

 SET @OldMes = ( SELECT  rhtype FROM  deleted )                     

 SET @UpdateMes = ( SELECT  rhtype  FROM  INSERTED)
                                 

在单独一条一条数据进行更新时不会报错,但在批量更新时就会报错,因为SQL执行数据库触发器是按语句级来执行,上述SQL语句就相当于把一张表赋值给一个变量,若是单条数据更新,则表里只有一条数据,是不会报错的,但在多条时就会报错。

因此,如何在只有语句级触发的SQL中实现行级触发?我使用的方法是整张表触发,即在update时无论是多条数据更新,还是单条数据更新,都将更新的数据放在一张表里,然后将表里的数据依次放在一个变量里,如:

 IF UPDATE(address)
                        SELECT  @Mesg = ‘‘ + @Mesg + ‘居住地址:‘
                                + LTRIM(ISNULL(b.ADDRESS, ‘‘)) + ‘,更新后:‘
                                + LTRIM(ISNULL(a.address, ‘‘)) + ‘;‘
                        FROM    INSERTED a
                                INNER JOIN DELETED b ON a.healthno = b.healthno
                        WHERE   ISNULL(a.address, ‘‘) <> ISNULL(b.address, ‘‘)--@Mesg是声明的变量

但是,要注意:

(1)上述SQL中ISNULL一定要有,因为SQL查询中若遇到null,则select出来的是空的,什么都没有,加上ISNULL(a.address, ‘‘)意思就是若a.address是null,则取后面的‘‘,否则则取a.address的值:;

(2) IF UPDATE(address)这条语句一定要有,不然的话若加了insert触发,则在数据插入时也会执行这条触发语句。

时间: 2024-10-11 02:01:10

SQL SERVER 触发器-改成成行级触发功能的相关文章

将SQL SERVER数据库改成MySql

格斗人网 (www.helpqy.com) 架构在阿里云上,最先想采用SQL SERVER,想大家都是微软家族的嘛.但是发现SQL SERVER需要的配置比较高,需要的银子也比较多,最后在纠结之下换成了MySql.由于整个网站基于微软的asp.net MVC架构,同时基于EF6.0,而MVC架构默认采用了SQL SERVER,这里又与code first混合在一起,所以在修改和过渡过程中还是遇到了不少问题.这个过程中参考了博客园不少前辈的文章,真是太感谢了.其中主要参考的一篇外文是:“ASP.N

SQL Server触发器

触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删除的时候会自动执行的特殊存储过程.触发器一般用在check约束更加复杂的约束上面.触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作.诸如:update.insert.delete这些操作的时候,系统会自动调用执行该表上对应的触发器.SQL Server 2005中触发器可以分为两类:DM

SQL Server 触发器 转http://www.cnblogs.com/hoojo/archive/2011/07/20/2111316.html

SQL Server 触发器 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删除的时候会自动执行的特殊存储过程.触发器一般用在check约束更加复杂的约束上面.触发器和普通的存储过程的区别是:触 发器是当对某一个表进行操作.诸如:update.insert.delete这些操作的时候,系统会自动调用执行该表上对应的触发器.SQL Server 2

(转)SQL Server 触发器

SQL Server 触发器 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删除的时候会自动执行的特殊存储过程.触发器一般用在check约束更加复杂的约束上面.触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作.诸如:update.insert.delete这些操作的时候,系统会自动调用执行该表上对应的触发器.SQL Server 20

15、SQL Server 触发器

SQL Server 触发器 触发器是一种特殊的存储过程,只有当试图用数据操作语言DML来修改数据时才会触发,DML包含对视图和表的增.删.改. 触发器分为DML触发器和DDL触发器,其中DML触发器会对数据表,视图进行insert.update.delete的时候触发.DDL则是create.alter.drop等时触发. DML触发器又分为after(之后触发)和insert of(之前触发)触发器. 如果在创建触发器的时候不指定类型,则默认是after触发器. 触发器有两个虚拟的临时表:插

如何编写sql server 触发器详解

在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程.常见的触发器有三种:分别应用于Insert , Update , Delete 事件. 编写之前要了解一个关键知识.触发器用到的两个临表:Deleted , Inserted . Deleted 和 Inserted 分别存储触发事件表的"旧的一条记录"和"新的一条记录". 一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧

Sql Server 触发器的应用

Sql Server 触发器:指的是 在进行  Insert .Update.Delete时 所执行的操作 我们可以在进行增删改操作的同时对其他数据进行操作.其实触发器算是一种存储过程,只不过执行的机制 只是在进行增删改操作时执行: 应用场景: 需求: 由于业务的需要,需要做一个统计报表,根据角色不同展示相应的四个系统的设备数据:   如果按照查询各个库中设备的数据汇总到一块,这样查询效率很低: 解决方案: 创建一个设备统计表: 使用SQL Server触发器,每增加.删除 设备数据时,同时触发

自己写的sql server触发器练练--高手请您跳过吧

set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgo ALTER TRIGGER [insertReplyToic] ON [dbo].[bbsReplyTopic] AFTER insertAS BEGIN --SET NOCOUNT ON; -- Insert statements for trigger here declare @uid int,@topicId int,@Rcontent nvarchar(max),@Rtime datetime,@c

SQL Server触发器创建、删除、修改、查看示例步骤

SQL Server触发器创建.删除.修改.查看示例步骤 一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约`束. 二﹕ SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表.这两个表. 一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约`束.