Значение плюс null

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть следующая процедура, запущенная на 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
    ,addon=@addon
    ,@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
  

затем процедура вызывается из другой процедуры, которая запускает множество процедур, т.Е.

 exec proc1
exec proc2
  

….
и т.д.

в одном процессе, предшествующем этому, поле baseprice задается в следующем процессе, поле Mktng задается в этом процессе, аддон и цена этажа задаются таким образом, что цена этажа предположительно равна = baseprice Mktng Addon после запуска процесса я закончил запись следующим образом:

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

Два вопроса;
1.- как я могу завершить с минимальной ценой 0.00, если addon равен null? (для nromal ansi по умолчанию установлено значение
значение NULL = NULL)

 I can't reproduce the effect
  

2. — Уверен ли я, что процедуры в процессе вызова выполняются по порядку?

спасибо

Комментарии:

1. Я не думаю, что вам следует устанавливать переменные в вашем заявлении update, а затем использовать их значения для установки значений столбцов. Определен ли вообще порядок операций?

Ответ №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) )
  

Ответ №2:

Попробуйте это:

Исправление:

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

Комментарии:

1. Я не думаю, что это именно то, о чем просит salomon. В случае, если это значение @AddOn равно null, приведенное выше приведет к @FloorPrice равному (BasePrice Mktng) . Я считаю, что salomon хочет @FloorPrice , чтобы в этом случае значение было равно 0.00.

2. А, понял… Исправленный ответ