2012-07-17 54 views
-1

我想寫一個存儲過程(SQL服務器2008R2),說我有一個表:如何編寫一個更好的存儲過程?

 
person 

Columns: 
Id int (pk) 
Date_of_birth date not null 
Phone int allow null 
Address int allow null 
Name nvarchat(50) not null 

的樣本數據:在存儲過程 Id=1,Date_of_birth=01/01/1987,phone=88888888,address=null,name='Steve'

Update語句,假設 這些參數已申報: Update person set [email protected],[email protected],[email protected],[email protected] where [email protected]

該表具有記錄任何更改的觸發器。 現在我有一個更新上述人表的一個asp.net更新頁面

問題是,如果用戶只是想更新地址='蘋果街',上述更新語句將更新所有字段,但不檢查if原始值=新值,然後忽略此字段,然後檢查下一個字段。所以我的日誌表會記錄所有的事件,即使列不會被更新。

在這一點上,我的解決方案

  1. 通過ID選擇所有的值,並將它們存儲到本地變量。 使用if-else檢查並生成更新語句。最後, 動態運行生成的SQL(sp_executesql)
  2. 按id選擇所有值並將它們存儲到本地變量中。 使用的if-else檢查和seperately更新每個字段:

If @dob <> @ori_dob
Begin
Update person set [email protected] where [email protected]
End

可能這是一個愚蠢的問題,但請諮詢我,如果你有更好的想法,謝謝!

+0

您的日誌表是否使用個人觸發器填充?如果是這樣,您可能需要考慮檢查每個列,而不是在更新過程中。 – pilotcam 2012-07-17 01:54:03

+0

如果用戶只更新其中一列,會出現什麼問題?爲什麼不讓他更新所有內容,如果其中一列正在更新已經具有相同的值;讓它也被更新。 – Icarus 2012-07-17 01:54:09

+0

@pilotcam我明白了。這是我的另一個解決方案,謝謝。 – 2012-07-17 02:20:54

回答

0

這是對OP評論的回答,並沒有解決原始問題。然而,這將是一個相當醜陋的評論。

你可以用這樣的語句來找到一個UPDATE觸發器中的變化Address

select i.Id, d.Address as OldAddress, i.Address as NewAddress 
    from inserted as i inner join 
    deleted as d on d.Id = i.Id 
    where d.Address <> i.Address 

人會需要的是要記錄每列這樣的說法。

您可以將SELECT的結果累加到單個表格變量中,然後彙總每個Id的結果。或者,您可以使用INSERT/SELECT將結果直接保存到日誌表中。

相關問題