2011-10-12 50 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))