近期第一次用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觸發,則在數據插入時也會執行這條觸發語句。方法