Mise à jour de l'logging en utilisant CTE?

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 WITH PriceCTE(ProductID, CategoryID, SalePrice) AS ( SELECT ProductID, CategoryID, SalePrice FROM CAT_Products WHERE CategoryID = @CategoryID ) SELECT ProductID,categoryID,SalePrice FROM PriceCTE DECLARE @Value DECIMAL(32,2), @Type NVARCHAR(5), @Inc_Dec NVARCHAR(5) SELECT @Value = value FROM VB_PriceRule WHERE ID = @PriceRuleID AND SiteId = @SiteID SELECT @Type = [type] FROM VB_PriceRule WHERE ID = @PriceRuleID AND SiteId = @SiteID SELECT @Inc_Dec = Inc_Dec FROM VB_PriceRule WHERE ID = @PriceRuleID AND SiteId = @SiteID IF(@Type = '+') BEGIN IF(@Inc_Dec = '%') BEGIN --print 'MSG' UPDATE CAT_Products SET SalePrice = SalePrice + (@Value/100*SalePrice) FROM PriceCTE WHERE CategoryID = @CategoryID END ELSE BEGIN UPDATE CAT_Products SET SalePrice = SalePrice + @Value FROM PriceCTE WHERE CategoryID = @CategoryID END END ELSE BEGIN IF(@Inc_Dec = '%') BEGIN UPDATE CAT_Products SET SalePrice = SalePrice - (@Value/100*SalePrice) FROM PriceCTE WHERE CategoryID = @CategoryID END ELSE BEGIN UPDATE CAT_Products SET SalePrice = SalePrice - @Value FROM PriceCTE WHERE CategoryID = @CategoryID END END END 

Q) Voici ma requête … Je veux mettre à jour le prix de vente de CAT_Products. Selon les conditions utilisant CTE. Mais il me donne les résultats comme "nom d'object invalide PriceCTE"

Un CTE est valide dans la scope de l'instruction unique dans laquelle il est défini. Par conséquent, puisque PriceCTE est défini dans la scope de l' SELECT … FROM PriceCTE , il ne peut pas être accédé dans vos UPDATE.

La solution suivante combine la définition CTE avec UPDATE. Il combine également toutes vos mises à jour en une seule déclaration.

 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 

Je n'ai pas modifié les noms des variables, mais, comme je l'ai dit dans un commentaire à votre question, deux variables, @Inc_Dec et @Type , semblent avoir besoin d'échanger des places. Je juge simplement par leurs noms, en particulier, par le nom @Inc_Dec : que l'on est plus susceptible de signifier + ou - , plutôt que % ou quoi que ce soit est la valeur opposée. Mais c'est juste une supposition, et vous devez mieux connaître vos affaires, naturellement.