首页 > 代码库 > SQL SERVER 触发器-改成成行级触发功能

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触发,则在数据插入时也会执行这条触发语句。

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