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