SQLServer Sortieren nach Klausel mit einem Parameterwert
-
23-09-2019 - |
Frage
Ich habe folgende gespeicherte Prozedur geschrieben. Wenn ich nicht verwenden IF ELSE Block Sortieren nach Klausel funktioniert gut, aber ich brauche IF ELSE zu verwenden, um meine Select-Anweisung zu bauen. Sortieren nach funktioniert nicht mit IF anderen Block. Können Sie mir bitte sagen, was mache ich falsch? Vielen Dank im Voraus!
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
Lösung
Haben Sie von RLT.Id bestellen möchten, wenn @LookupTypeId @MonthType gleich und durch RLT.Value sonst? Dann sollte der Fall so aussehen:
ORDER BY
CASE @LookupTypeId
WHEN @MonthType THEN RLT.Id
ELSE RLT.Value
END
Wenn jedoch RLT.Id und RLT.Value nicht beide die gleiche Art erhalten Sie einen Konvertierungsfehler erhalten. Wenn RLT.Id ist int und RLT.Value ist varchar dann könnte man den Fall ändern:
ORDER BY
CASE @LookupTypeId
WHEN @MonthType THEN STR(RLT.Id)
ELSE RLT.Value
END
Andere Tipps
Ich denke, dass Ihre Bestellung durch Klausel Syntax gemischt - ist diese Abfrage ausführen? oder hat sie geben einen Syntaxfehler?
Ist das, was Sie suchen?
ORDER BY -- Order by will change for only Months by ID
CASE @LookupTypeId
WHEN @MonthType THEN RLT.Id
ELSE RLT.Value
END