#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. А, понял… Исправленный ответ