2012-05-13 63 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