SQL Server的ORDER BY子句用一个参数值
-
23-09-2019 - |
题
我已经写下面的存储过程。如果我不使用IF by子句ELSE块秩序工作正常,但我需要的,如果其他人使用来构建我的select语句。由是为了不与其他IF块工作。你能告诉我什么我做错了吗? 先谢谢了!
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 -- Order by will change for only Months by ID
CASE @LookupTypeId
WHEN @MonthType THEN RLT.Id
ELSE RLT.Value
END
不隶属于 StackOverflow