2

我有一个没有大量列的数据库表。我想编写一个 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 而我无法使用上述解决方案来做到这一点。谁能告诉我我该怎么办?

4

1 回答 1

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

然后从代码调用时,您只需传递您知道需要更新的参数,或显式设置@null 列以强制为空。

于 2012-05-13T13:32:04.850 回答