2016-12-14 34 views
0

我有以下過程來跟蹤表中的列更改。通過使用OUTPUT子句獲取只更新的列sql

ALTER PROCEDURE [UpdateAddress] 
@id bigint=0, 
@fullname varchar(200)='', 
@address varchar(200)='', 
@city varchar(200)='', 
@state varchar(200)='' 
AS 
declare @desc varchar(500); 
BEGIN 
DECLARE @MyTableVar table( 
    fullname varchar(200) NULL, 
    address varchar(200) NULL , 
    city varchar(200) NULL , 
state varchar(200) NULL); 


     BEGIN 
      UPDATE [Address] 
      SET 
       [email protected], 
       [email protected], 
       [email protected], 
       [email protected] 

      OUTPUT deleted.fullname, 
     deleted.address, 
     deleted.city, 
     deleted.state 
INTO @MyTableVar 
      WHERE [Id][email protected] 

這裏我會得到所有更新和不更新的列。所以我們需要比較兩個像deleted.fullname and inserted.fullname。所以,如果我在表格中有20列,並且只更新了2列。沒有比較,有什麼辦法只使用輸出子句獲取更新的列?

例如:我有20列。因爲我只更新了全名和地址。所以我應該得到全名,地址改變。沒有任何比較。有沒有像updated_column()

感謝您的任何SQL內置函數...

+0

對您的基本問題的簡單回答是否,沒有內在的方式只返回更新的數據。比較插入和刪除是確定更改內容的有效方法。 –

+0

如果我有20列,那麼我必須檢查所有條件。好的,謝謝你的回覆... – RUPA

回答

0

可以在output使用標量表達式。所以,你可以表示「沒有變化」的,也就是說,NULL

OUTPUT (case when inserted.fullname <> deleted.fullname then deleted.fullname end), 
     (case when inserted.address <> deleted.address then deleted.address end), 
     (case when inserted.city <> deleted.city then deleted.city end), 
     (case when inserted.state <> deleted.state then deleted.state end) 

這是明確的,如果以前的列值永遠不會NULL

你也可以使用同樣的想法可列出更改的列在一起:

OUTPUT deleted.fullname, 
     deleted.address, 
     deleted.city, 
     deleted.state, 
     ((case when inserted.fullname <> deleted.fullname then 'fullname;' else '' end) + 
     (case when inserted.address <> deleted.address then 'address;' else '' end) + 
     (case when inserted.city <> deleted.city then 'city;' else '' end) + 
     (case when inserted.state <> deleted.state then 'state;' else '' end) 
     ) 

的表達會比較複雜一點,包括NULL檢查。

+0

我有20列。所以程序會很沉重......通過比較,我已經刪除和插入,正如我所提到的。所以沒有這個比較,我可以只更新列嗎? – RUPA