2011-10-12 45 views
-1

我有以下程序上的SQL Server 2005值加空

ALTER proc [dbo].[p_shipavgAddOnUpdate] 
as 
begin 
declare @addon decimal(20,2),@FloorPrice decimal(20,2) 

update z 
set 
@addon = case when pp.mapprice>0 
     then 0 
     else    
      (BasePrice + Mktng) *.027 
-- to allow for a higher sale price than the base price 
     end 
    ,[email protected] 
    ,@FloorPrice = (BasePrice + Mktng + @AddOn) 
    ,@FloorPrice = 

    CASE WHEN @FloorPrice > COALESCE(pp.mapPrice, 0) 
    THEN @FloorPrice 
    ELSE .mapPrice 
    END 
,FloorPrice = @FloorPrice 
,FloorOffer = @FloorPrice + FinalShippCost 
FROM zshipaverage z 
    inner join products p on z.sku = p.sku 
     inner join product_pricing pp on p.productid=pp.product 
end 

那么PROC会从另一个PROC,它运行了一堆特效的所谓运行,即

exec proc1 
exec proc2 

... 。 等在一个PROC在此之前,一个

,该baseprice字段设置 在未来PROC,该Mktng字段设置 在这个亲c中的插件,和floorprice正在运行我与记录 作为这样结束后PROC设定 所以floorprice被假设是= baseprice + Mktng +附加组件 :

baseprice = 6.14 
mktng  = 2.13 
addon  = NULL 
floorprice= 0.00 

两个问题; 1.-如果插件为空,我怎么能以0.00的floorprice结束? (nromal ANSI默认设置为 值+ NULL = NULL)

I can't reproduce the effect 

2:我是放心的是,在呼叫PROC的程序,以便在运行?

日Thnx

+1

,我不认为你应该在你的更新语句中使用来设置变量,然后他们的值来设置列值。操作顺序是否定义了? –

回答

0

试试这个:

更正:

, @FloorPrice = CASE WHEN @AddOn IS NULL THEN 0 ELSE (BasePrice + 
       Mktng+ 
       @AddOn) END 
+0

我不认为这正是萨洛蒙所要求的。在“@ AddOn”为空的情况下,以上将导致“@ FloorPrice”等于“(BasePrice + Mktng)”。我相信萨洛蒙在这种情况下希望'@ FloorPrice'等于0.00。 –

+0

啊,呃...纠正了答案 –

1

这是正确的,在你的代码

@FloorPrice = 
CASE WHEN 
@FloorPrice > COALESCE(pp.mapPrice, 0) THEN 
@FloorPrice ELSE .mapPrice END 

您是NULL检查pp.mapPrice之前设置的@FloorPrice值这意味着@FloorPrice将为0,如果任何组分是NULL

您可能还需要更换其它部分如下:

, @FloorPrice = (ISNULL(BasePrice,0) + 
       ISNULL(Mktng,0) + 
       ISNULL(@AddOn,0))