2011-12-11 72 views
0

我有一個關於通過t-sql更新表的問題。客戶可能想要更新一列中的一列,並保持其餘的不變或他可能想要更新多列。所以我有兩種解決方案:一個t-sql存儲過程和更新整個表或

  1. 創建一個sp並更新整個表。客戶端必須提供所有的參數,即使他想要更新一行中的單個列,所以如果他沒有參數的話他必須通過(他必須)...原來的值將會丟失。作爲一種解決方法,我可以使用條件來檢查空參數(基於條件的不同命令)。但是還有另外一個問題,我怎麼能識別一個int參數?我的意思是假設我們有一個int列,它可以包含任何整數值,包括零,所以客戶端應該發送什麼樣的消息來表示「這不是一個新值,而是保持現有值」。

  2. 爲每列創建一個sp。客戶端將使用適當的sp來更新一行中的單個列,所以如果他想更新多個列,他可以一個接一個地調用每個相關的sp,並傳遞兩個參數,它們是行ID和新值。如果我有一個包含25個可更新列的表?天啊! 25更新sp只是一張桌子!

是否必須爲每個表列創建更新sp?或者創建一個採用所有行參數並更新整個表的sp?什麼是編寫更新程序的事實標準?

EDIT1:我正在使用sql server 2005與前端c#和asp.net應用程序,但我想在t-sql中做到這一點。

+1

您正在使用什麼版本的SQL Server? – Oded

回答

0

如果你真的必須在T-SQL中做到這一點,那麼唯一可行的方法是使用動態SQL。如果你考慮到這點,你必須首先閱讀(並理解!)厄蘭Sommarskogs優秀論文The curse and blessings of dynamic SQL - 絕對必讀!

基本上,你會有一個存儲過程,需要你的25個參數。如果不需要更新,其中的每一個都可以爲NULL。

在你的存儲過程中,你基本上根據哪些參數是非NULL來建立你的T-SQL UPDATE語句,最後執行那條語句。

這給你一個程序,但該程序將是相當凌亂的看看。

0

您可以在更新中使用case語句並測試參數null以查看是否應該使用該參數或者是否應該使用表中已有的值。

create procedure UpdateYourTable 
    @ID int, 
    @Col1 int = null, 
    @Col2 int = null 
as 
update YourTable 
set Col1 = case when @Col1 is null 
      then Col1 
      else @Col1 
      end, 
    Col2 = case when @Col2 is null 
      then Col2 
      else @Col2 
      end 
where ID = @ID 

執行這樣的設定值Col2,並使用了Col1中的默認值null

exec UpdateYourTable @ID = 1, @Col2 = 200