2010-02-26 159 views
1

我已经编写了以下存储过程。如果我不使用IF ELSE块Order by子句工作正常,但我需要使用IF ELSE来构建我的select语句。排序依据不适用于IF else块。你能告诉我我做错了什么吗? 在此先感谢!SQL服务器按参数值排序

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 
+0

请在标记中的单词之间使用连字符(“ - ”)。 “sql-server-2008”,而不是“sql server 2008”。 – 2010-02-26 18:46:15

回答

0

你想通过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 
+0

由于2种不同的数据类型RLT.ID和RLT.Value,这将不起作用。这就是我必须这样写Orderry条款的原因。按条款排序工作正常。没有错误。事实上,如果我不使用IF else作为我的选择顺序,caluse不仅可以正常工作,还可以使用iF else块。 – user228777 2010-02-26 19:30:58

+0

但在你的问题中,它表示“按子句排序不能与其他块一起工作”。用两个CASE编写的方式会导致排序和子排序。你有没有试过我用STR()给出的第二个例子?请在@LookupTypeId = @MonthType时指出您期望的一些样本结果以及期望的结果,当它们不相等时,请说明您需要的内容。 – DyingCactus 2010-02-26 23:07:03

0

我觉得你的ORDER BY子句语法混合起来 - 这是否查询运行?或者它给出了语法错误?

这是你在找什么?

ORDER BY -- Order by will change for only Months by ID 
    CASE @LookupTypeId 
    WHEN @MonthType THEN RLT.Id 
    ELSE RLT.Value 
    END 
+0

由于2种不同的数据类型RLT.ID和RLT.Value,这将不起作用。这就是我必须这样写Orderry条款的原因。按条款排序工作正常。没有错误。事实上,如果我不使用IF else作为我的选择顺序,caluse不仅可以正常工作,还可以使用iF else块。 – user228777 2010-02-26 19:31:51