2009-07-31 79 views
3

嗨,我在SQL新手,需要帮助 我有一个包含一个更新查询像一个参数化存储过程...保留在数据库原值时,NULL值传递给存储过程

UPDATE sometable 
SET 
    price1 = @param1, 
    price2 = @param2, 
    price3 = @param3, 
    price4 = @param4, 
WHERE 
    ID = @param5 

现在当我通过将任何参数值设置为NULL来执行此SP时,它会在DB中更新,我想知道的是如果其中一个参数值为NULL,那么我们是否可以在DB中保留该列原始值,而不是使用NULL更新它。

回答

7

在SQLServer中的整洁的方法是使用ISNULL(@param1, price1)

这需要@param1并检查它是否为NULL。如果它是NULL,则用来自price1的值替换。我喜欢ISNULL,因为它的可读性非常好,它在锡纸上说的是什么。

尽管这不是ANSI SQL,但存在一个更灵活的命令:COALESCE。它就像ISNULL,但可以使用任意数量的参数。它将搜索它们以获取第一个非NULL值。如果没有找到,返回NULL ...


UPDATE sometable 
SET 
     price1 =  ISNULL(@param1, price1), 
     price2 =  ISNULL(@param2, price2), 
     price3 =  ISNULL(@param3, price3), 
     price4 =  ISNULL(@param4, price4) 
WHERE 
     ID = @param5 


UPDATE sometable 
SET 
     price1 =  COALESCE(@param1, price1), 
     price2 =  COALESCE(@param2, price2), 
     price3 =  COALESCE(@param3, price3), 
     price4 =  COALESCE(@param4, price4) 
WHERE 
     ID = @param5 


另见: “COALESCE vs ISNULL

2

尝试用一个CASE语句包裹@paramx:

CASE @paramx WHEN NULL,则pricex ELSE @paramx END

相关问题