我有一个包含大量列的数据库表。我想写一个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而我无法使用上述解决方案。谁能告诉我该怎么办?
答案 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以强制为空。