Ordinare SQL Server clausola con un valore di parametro
-
23-09-2019 - |
Domanda
Ho scritto stored procedure seguente. Se io non uso IF ELSE blocco clausola ORDER BY funziona bene, ma ho bisogno di usare IF ELSE per costruire la mia dichiarazione prescelta. Ordina per non funziona con IF blocco else. Potete per favore dirmi che cosa sto sbagliando? Grazie in anticipo!
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
Soluzione
Vuoi ordinare da RLT.Id quando @LookupTypeId uguale @MonthType e RLT.Value altrimenti? Poi il caso dovrebbe essere simile a questo:
ORDER BY
CASE @LookupTypeId
WHEN @MonthType THEN RLT.Id
ELSE RLT.Value
END
Tuttavia, se RLT.Id e RLT.Value non sono entrambi dello stesso tipo si ottiene un errore di conversione. Se RLT.Id è int e RLT.Value è varchar allora si potrebbe cambiare il caso di:
ORDER BY
CASE @LookupTypeId
WHEN @MonthType THEN STR(RLT.Id)
ELSE RLT.Value
END
Altri suggerimenti
Credo che l'ordine per la sintassi clausola si confonde - viene eseguito questa ricerca? o lo fa dare un errore di sintassi?
E 'questo quello che stai cercando?
ORDER BY -- Order by will change for only Months by ID
CASE @LookupTypeId
WHEN @MonthType THEN RLT.Id
ELSE RLT.Value
END