0

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

Я использую псевдонимы столбцов в этой процедуре. Я получил ошибку, в то время как значения порядка, используя имена столбцов псевдонима. Ниже моя процедура.

ALTER Procedure [dbo].[WP_GetVendorPriceList] 
    @ItemType  bit, 
    @OrderMode  bit, 
    @VendorName  varchar(75), 
    @OrderBy   varchar(75) 
as 
Begin 
    DECLARE @QueryVendorName varchar(max), @QueryAllVendorObs varchar(max), @QueryAllVendorNonObs varchar(max), @WhereQuery varchar(max) 

    SET @QueryAllVendorNonObs = ';WITH 
    cteForPrice AS (
    Select ItemID, ItemPartNumber, ItemDescription, CreatedDate, InitialPrice, HP As HPPrice, Apple As ApplePrice, Microsoft As MicrosoftPrice, IBM As IBMPrice 
    from (select v.ItemID, VendorName, VendorPrice, ItemPartNumber, ItemDescription, CreatedDate, InitialPrice from VendorItemPricing as v left join MasterItems as m on v.ItemID = m.ItemID)A 
    PIVOT(MAX(VendorPrice) FOR VendorName IN (HP,Apple,Microsoft,IBM))P), 

    cteForDate AS (SELECT ItemID, HP AS HPUpdatedDate, Apple AS AppleUpdatedDate, Microsoft AS MicrosoftUpdatedDate, IBM AS IBMUpdatedDate 
    FROM (SELECT ItemID, VendorName, UpdatedDate FROM VendorItemPricing) A 
    PIVOT(MAX(UpdatedDate) FOR Vendorname IN (HP, Apple, Microsoft, IBM))P), 

    cteForObsolete AS (
    SELECT ItemID, HP AS HPObsoleteItem, Apple AS AppleObsoleteItem, Microsoft AS MicrosoftObsoleteItem, IBM AS IBMObsoleteItem 
    FROM (SELECT Itemid, Vendorname, CAST(ObsoleteItem AS TINYINT) AS INTColumn FROM VendorItemPricing) A 
    PIVOT(MAX(INTColumn) FOR Vendorname IN (HP, Apple, Microsoft, IBM)) P) 

    SELECT cteForPrice.ItemID, cteForPrice.ItemPartNumber, cteForPrice.ItemDescription, 
     CASE 
      WHEN HPObsoleteItem = 0 THEN HPPrice 
      WHEN AppleObsoleteItem = 0 THEN ApplePrice 
      WHEN (IBMObsoleteItem = 0 OR MicrosoftObsoleteItem = 0) AND ISNULL((IBMPrice), 0) > ISNULL((MicrosoftPrice), 0) THEN IBMPrice 
      WHEN (IBMObsoleteItem = 0 OR MicrosoftObsoleteItem = 0) AND ISNULL((MicrosoftPrice), 0) > ISNULL((IBMPrice), 0) THEN MicrosoftPrice 
     END AS Price, 
     CASE 
      WHEN HPObsoleteItem = 0 THEN cteForDate.HPUpdatedDate 
      WHEN AppleObsoleteItem = 0 THEN cteForDate.AppleUpdatedDate 
      WHEN (IBMObsoleteItem = 0 OR MicrosoftObsoleteItem = 0) AND ISNULL((IBMPrice), 0) > ISNULL((MicrosoftPrice), 0) THEN cteForDate.IBMUpdatedDate 
      WHEN (IBMObsoleteItem = 0 OR MicrosoftObsoleteItem = 0) AND ISNULL((MicrosoftPrice), 0) > ISNULL((IBMPrice), 0) THEN cteForDate.MicrosoftUpdatedDate 
     END AS UpdatedDate 
    FROM cteForPrice 
    JOIN cteForObsolete ON cteForPrice.ItemID = cteForObsolete.ItemID 
    JOIN cteForDate ON cteForPrice.ItemID = cteForDate.ItemID' 

    SET @WhereQuery = ' ORDER BY 
         CASE WHEN '''+ @OrderBy +'''=''Price'' AND '+ cast (@OrderMode as varchar(10)) +'= 0 THEN Price END ASC, 
         CASE WHEN '''+ @OrderBy +'''=''Price'' AND '+ cast (@OrderMode as varchar(10)) +'= 1 THEN Price END DESC' 

    IF @VendorName != 'All' 
    BEGIN 
     exec (@QueryVendorName + @WhereQuery) 
    END 
    ELSE IF @VendorName = 'All' AND @ItemType = 0 
    BEGIN 
     exec (@QueryAllVendorNonObs + @WhereQuery) 
    END 
    ELSE IF @VendorName = 'All' AND @ItemType = 1 
    BEGIN 
     exec (@QueryAllVendorObs + @WhereQuery) 
    END 
End 

Я получал эту ошибку, всякий раз, когда я пытаюсь выполнить эту процедуру.

Msg 207, Level 16, State 1, Line 36
Недопустимое имя столбца 'Цена'.
Msg 207, уровень 16, состояние 1, строка 37
Недопустимое название столбца «Цена».

P.S: Я получаю эту ошибку только на динамическом SQL, если я запускаю его без динамики у меня нет никаких проблем.

ответ

1

Изменить

SET @WhereQuery = ' ORDER BY 
        CASE WHEN '''+ @OrderBy +'''=''Price'' AND '+ cast (@OrderMode as varchar(10)) +'= 0 THEN Price END ASC, 
        CASE WHEN '''+ @OrderBy +'''=''Price'' AND '+ cast (@OrderMode as varchar(10)) +'= 1 THEN Price END DESC' 

в

SET @WhereQuery = ' ORDER BY ' + 
        CASE 
         WHEN @OrderBy = Price AND @OrderMode = 0 THEN 'Price ASC' 
         WHEN @OrderBy = Price AND @OrderMode = 1 THEN 'Price DESC' 
         ELSE '1' 
        END 

или

SET @WhereQuery = ' ORDER BY ' + 
        CASE 
         WHEN @OrderBy = Price AND @OrderMode = 0 THEN '4 ASC' 
         WHEN @OrderBy = Price AND @OrderMode = 1 THEN '4 DESC' 
         ELSE '1' 
        END 
Смежные вопросы