2010-02-26 42 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