2015-11-05 35 views
0

我有一個下面給出的存儲過程,我必須動態地對結果進行排序,但它給出了語法錯誤。請告訴我正確的方式做到這一點按條款排序的多個case表達式SQL Server

SELECT * 
FROM [TableName] 
ORDER BY CASE @OrderBy 
     WHEN 'DESC' 
      THEN CASE @Sort 
        WHEN 'CreatedOn' 
         THEN CreatedOn 
        WHEN 'EmployeeName' 
         THEN EmployeeName 
        WHEN 'EmployeeCode' 
         THEN EmployeeCode 
        WHEN 'Country' 
         THEN Country 
        WHEN 'Location' 
         THEN Location 
        WHEN 'Skill' 
         THEN Skill 
        WHEN 'ProcessName' 
         THEN ProcessName 
        WHEN 'RoleName' 
         THEN RoleName 
        WHEN 'JoiningDate' 
         THEN JoiningDate 
        ELSE CreatedOn 
        END DESC 
     ELSE CASE @Sort 
       WHEN 'CreatedOn' 
        THEN CreatedOn 
       WHEN 'EmployeeName' 
        THEN EmployeeName 
       WHEN 'EmployeeCode' 
        THEN EmployeeCode 
       WHEN 'Country' 
        THEN Country 
       WHEN 'Location' 
        THEN Location 
       WHEN 'Skill' 
        THEN Skill 
       WHEN 'ProcessName' 
        THEN ProcessName 
       WHEN 'RoleName' 
        THEN RoleName 
       WHEN 'JoiningDate' 
        THEN JoiningDate 
       ELSE CreatedOn 
       END ASC 
     END 
+0

表達式,而不是case語句... – jarlh

+1

@jarlh correct。更正了問題 – VIVEK

+0

如果您發佈嘗試執行查詢時遇到的語法錯誤,將會有所幫助。 – fez

回答

3

你的語法錯誤是CASE表達式中使用DESC。它用於限定排序順序;它不在CASE內理解。

此外,您有潛在的運行時錯誤。 case表達式返回單個類型的單個值。所以,最好是單獨列出的每個條件:

ORDER BY (CASE @OrderBy = 'DESC' AND @Sort = 'CreatedOn' THEN CreatedOn END) DESC, 
     (CASE @OrderBy = 'DESC' AND @Sort = 'EmployeeName' THEN EmployeeName END) DESC, 
     . . . 
     (CASE @OrderBy = 'ASC' AND @Sort = 'CreatedOn' THEN CreatedOn END), 
     (CASE @OrderBy = 'ASC' AND @Sort = 'EmployeeName' THEN EmployeeName END), 
     . . . 

說實話,對於這種類型的查詢,如果您對ORDER BY列的索引動態SQL是更有效的。