2015-11-05 34 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是更有效的。