SQL SERVER 觸發器-改爲成行級觸發功能

       近期第一次用SQL SERVER寫觸發器,發現SQL與ORACLE的觸發器仍是有區別的,最大區別:數據庫

       (1)SQL只有語句級觸發,沒有行級觸發;spa

       (2)ORACLE有語句級觸發和行級觸發;code

 

       因爲SQL沒有行級觸發,所以單獨使用語句級來編寫觸發器會出現問題。爲通俗易懂,舉個例子:用SQL編寫一個update觸發器,在update數據時觸發,若用如下語句blog

 SET @OldMes = ( SELECT  rhtype FROM  deleted )                     
 
 SET @UpdateMes = ( SELECT  rhtype  FROM  INSERTED) 
                                 

      在單獨一條一條數據進行更新時不會報錯,但在批量更新時就會報錯,由於SQL執行數據庫觸發器是按語句級來執行,上述SQL語句就至關於把一張表賦值給一個變量,如果單條數據更新,則表裏只有一條數據,是不會報錯的,但在多條時就會報錯。class

     所以,如何在只有語句級觸發的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是聲明的變量

     可是,要注意:date

      (1)上述SQL中ISNULL必定要有,由於SQL查詢中若遇到null,則select出來的是空的,什麼都沒有,加上ISNULL(a.address, '')意思就是若a.address是null,則取後面的'',不然則取a.address的值:;select

    (2) IF UPDATE(address)這條語句必定要有,否則的話若加了insert觸發,則在數據插入時也會執行這條觸發語句。方法

相關文章
相關標籤/搜索