У меня есть хранимая процедура в моей базе данных. Он имеет динамические значения 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, если я запускаю его без динамики у меня нет никаких проблем.