2012-05-13 97 views
1

我有一個數據庫表,它有大量的列。我想編寫一個T-SQL存儲過程,它將更新該表中的記錄,並且我希望使用該過程來更新所有或唯一的特定列,以便如果傳遞NULL值的任何列值都不應超過現有值被改變。目前,我可以像使用這些更新SQL Server表中的特定列並忽略空值

UPDATE table 
    SET column1 = COALESCE(@param1, column1), 
     column2 = COALESCE(@param2, column2), 
     ... 
    WHERE id = @id 

UPDATE table 
set column1 = isnull(@param1,column1), 
     column2 = isnull(@param2,column2) 

他們都行之有效的解決方案,我唯一的問題是,有時我想明確地保存無效在任一列,我不能用它做以上解決方案有人可以告訴我該怎麼辦?

回答

2

我們使用的方法,它的作品真的很好,是爲每列聲明兩個參數,第一個是包含的價值,二是有點指示查詢爲空明確地插入。例如

create table example (column1 nvarchar(255), column2 nvarchar(255)) 

create procedure pUpdate(
    @column1 nvarchar(255) = null, 
    @nullColumn1 tinyint = 0, 
    @column2 nvarchar(255) = null, 
    @nullColumn2 tinyint = 0 
    ) as 
    BEGIN 

    update example 
     set column1 = Case When @nullcolumn1 = 1 Then NULL ELSE IsNull(@column1, column1) End 
     set column2 = Case When @nullcolumn2 = 1 Then NULL ELSE IsNull(@column2, column2) End 

    END 

然後從代碼中調用的時候,你只需要傳遞您知道需要更新,或明確地設置@nullcolumn強制空的參數。

+0

詹姆斯感謝這個解決方案,它看起來非常簡單的解決方案,以實現唯一的問題是,對於大的表,我們需要創建更新存儲過程這麼多額外的參數,但到目前爲止,這是最好的解決方案,我有直至除非別人帶來另一種解決方案。再次感謝。 – Waqas