CTE действителен в рамках одного оператора, в котором он определен. Следовательно, поскольку PriceCTE
определен в области действия оператора SELECT … FROM PriceCTE
, к нему нельзя получить доступ в ваших UPDATE.
Следующее решение объединяет определение CTE с UPDATE.Он также объединяет все ваши обновления в одном выражении.
ALTER PROCEDURE SP_PriceUpdate
-- Add the parameters for the stored procedure here
@PriceRuleID INT = NULL,
@CategoryID INT = NULL,
@SiteID INT = NULL
AS
SET NOCOUNT ON;
BEGIN
DECLARE
@Value DECIMAL(32,2),
@Type NVARCHAR(5),
@Inc_Dec NVARCHAR(5);
SELECT
@Value = value,
@Type = [type],
@Inc_Dec = Inc_Dec
FROM
VB_PriceRule
WHERE
ID = @PriceRuleID
AND SiteId = @SiteID;
WITH PriceCTE(ProductID, CategoryID, SalePrice)
AS
(
SELECT
ProductID, CategoryID, SalePrice
FROM
CAT_Products
WHERE
CategoryID = @CategoryID
)
UPDATE PriceCTE
SET
SalePrice = SalePrice + @Value *
(
CASE @Type WHEN '+' THEN 1 ELSE -1 END *
CASE @Inc_Dec WHEN '%' THEN SalePrice / 100 ELSE 1 END
)
END
Я не менял имена переменных, но, как я сказал в комментарии к вашему вопросу, две переменные, @Inc_Dec
и @Type
,выглядеть так, как будто им нужно поменяться местами.Я просто судю по их именам, в частности, по имени @Inc_Dec
: это, скорее всего, будет означать +
или -
, а не %
или что-то противоположное.Но это всего лишь предположение, и вы, естественно, должны лучше знать свои вещи.