更新SQL Server表中的特定列并忽略Null值

时间:2012-05-13 13:15:02

标签: tsql null

我有一个包含大量列的数据库表。我想写一个T-SQL存储过程,它将更新该表中的记录,我想使用该过程更新所有或仅特定的列,如果为任何列值传递NULL而不是现有值不应该改变了。目前我可以使用这些解决方案

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)

它们都运行良好,我唯一的问题是有时候我想在任何列中显式保存null而我无法使用上述解决方案。谁能告诉我该怎么办?

1 个答案:

答案 0 :(得分:2)

我们使用的方法非常有效,是为每列声明两个参数,第一个包含值,第二个是指示查询明确插入null的位。例如

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以强制为空。