Sql-сервер Упорядочить по предложению со значением параметра

StackOverflow https://stackoverflow.com/questions/2344002

  •  23-09-2019
  •  | 
  •  

Вопрос

Я написал следующую хранимую процедуру.Если я не использую блок IF ELSE, предложение Order by работает нормально, но мне нужно использовать IF ELSE для построения оператора выбора.Порядок по Не работает с блоком IF else.Подскажите, пожалуйста, что я делаю не так?Заранее спасибо!

ALTER PROCEDURE [dbo].[GetLookupItem] 

-- #description Gets LookupItem 
-- #tables   Subscriber.Reference.LookupItem,Subscriber.Reference.LookupText,Subscriber.Reference.LookupType
-- #parameter:   @LookupTypeId       This parameter defines a type of lookup
-- #parameter:   @LookupTextAbbreviationId            This Variable decides to tie Lookup Text to Abbreviation or Full Text. Most of the cases Full text will be used.
-- #parameter:   @LanguageCode     To show the Lookup Text in this Language

 @LookupTypeId int,
 @LookupTextAbbreviationId int ,
 @LanguageCode varchar(5)


AS

BEGIN

 SET NOCOUNT ON;
 DECLARE @MonthType int
 SET @MonthType = (SELECT Id FROM Subscriber.Reference.LookupType WHERE Name = 'Months')

 IF  @LookupTextAbbreviationId IS NULL
  BEGIN
   SELECT RLI.Id,RLT.Value
   FROM Subscriber.Reference.LookupItem RLI
   INNER JOIN Subscriber.Reference.LookupText RLT
   ON RLI.LookupTextId = RLT.Id AND RLT.LanguageCode = @LanguageCode AND RLI.LookupTextAbbreviationId IS NULL   -- LookupTextAbbreviationId will be null for full text records in Subscriber.Reference.LookupItem
   WHERE RLI.LookupTypeId = @LookupTypeId 
  END
 ELSE

  SELECT RLI.Id,RLT.Value
  FROM Subscriber.Reference.LookupItem RLI
  INNER JOIN Subscriber.Reference.LookupText RLT
  ON RLI.LookupTextAbbreviationId = RLT.Id AND RLT.LanguageCode = @LanguageCode
  WHERE RLI.LookupTypeId = @LookupTypeId


        ORDER BY                -- Order by will change for only Months by ID
        CASE  @LookupTypeId 
   WHEN @MonthType THEN RLT.Id 
   END,
  CASE 
   WHEN @LookupTypeId <> @MonthType THEN RLT.Value 
  END

 IF (@@ERROR <> 0)
  RETURN 1
 ELSE
  RETURN 0  

END
Это было полезно?

Решение

Хотите ли вы сделать заказ по RLT.Id, если @LookupTypeId равен @MonthType, и по RLT.Value в противном случае?Тогда дело должно быть таким:

ORDER BY
CASE @LookupTypeId 
   WHEN @MonthType THEN RLT.Id
   ELSE RLT.Value
END

Однако если RLT.Id и RLT.Value не относятся к одному и тому же типу, вы получите ошибку преобразования.Если RLT.Id — int, а RLT.Value — varchar, вы можете изменить регистр на:

ORDER BY
CASE @LookupTypeId 
   WHEN @MonthType THEN STR(RLT.Id)
   ELSE RLT.Value
END

Другие советы

Я думаю, что синтаксис вашего предложения по порядку перепутан. Этот запрос выполняется?или это выдает синтаксическую ошибку?

Это то, что вы ищите?

ORDER BY  -- Order by will change for only Months by ID 
  CASE  @LookupTypeId  
    WHEN @MonthType THEN RLT.Id  
    ELSE RLT.Value  
  END
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top