2014-07-23 95 views
0

我已经它使用动态排序的存储过程,2个参数确定排序 - 柱:@SortIndex和排序方向:@SortDirectionSQL Server的动态排序

相关的代码:

... 
ROW_NUMBER() OVER 
      (
      ORDER BY 
      -- string order by 
      CASE @SortDirection 
        WHEN 'ASC' THEN 
        CASE @SortIndex 
         WHEN 1 THEN SKU 
         WHEN 2 THEN BrandName 
         WHEN 3 THEN ItemName 
        END    
       END ASC, 
       CASE @SortDirection 
        WHEN 'DESC' THEN 
        CASE @SortIndex 
         WHEN 1 THEN SKU 
         WHEN 2 THEN BrandName 
         WHEN 3 THEN ItemName 
        END 
       END DESC, 

这种种在单列上,但是我想在@SortIndex为2时对BrandName ASC, ItemName ASC进行排序。

+2

我建议动态SQL(建立在字符串中查询和执行它)。复杂的排序可以很快导致许多CASE结构覆盖它。 –

+0

您在When 2子句中尝试了Brandname + ItemName吗? –

+0

如果你走这条路,请小心。你有看起来像参数的字符串。你需要注意sql注入并使用参数化的动态sql。 –

回答

0
ROW_NUMBER() OVER 
      (
      ORDER BY 
      -- string order by 
      CASE @SortDirection 
        WHEN 'ASC' THEN 
        CASE @SortIndex 
         WHEN 1 THEN SKU 
         WHEN 2 THEN BrandName + ',' + ItemName 
         WHEN 3 THEN ItemName 
        END    
       END ASC, 
       CASE @SortDirection 
        WHEN 'DESC' THEN 
        CASE @SortIndex 
         WHEN 1 THEN SKU 
         WHEN 2 THEN BrandName + ',' + ItemName 
         WHEN 3 THEN ItemName 
        END 
       END DESC, 

用名优产品+ ITEMNAME在当2条第并有两个字段在排序中使用。

3

如果不能使用动态SQL,唯一的方法是列出所有可能的组合ASCDESC

例如:

ORDER By 
CASE WHEN @SortIndex = '1' AND @SortDirection = 'ASC' THEN SKU END, 
CASE WHEN @SortIndex = '1' AND @SortDirection = 'DESC' THEN SKU END DESC, 
CASE WHEN @SortIndex = '2' AND @SortDirection = 'ASC' THEN BrandName END, 
CASE WHEN @SortIndex = '2' AND @SortDirection = 'DESC' THEN BrandName END DESC, 
--and so on... 
-2

一种通用样品....通过K.AryaeeMoeen

--------------------------------------------------- 
SELECT 1 AS Num, '2015-06-22' AS Datex INTO Arya 
INSERT INTO Arya 
SELECT 2, '2015-08-17' UNION SELECT 3, '2015-07-14' 
--------------------------------------------------- 
Now, Dynamic sorting(Base on Datex Field) in a SELECTION .... 
--------------------------------------------------- 
SELECT Num, Date1 FROM ARYA, (SELECT -1 as e union Select 1 as e) a 
WHERE a.e=-1 --(OR a.e=1) For Dynamic Sort 
ORDER BY DATEDIFF(DAY, '2000-01-01', Arya.Datex)*sign(a.e) 
---------------------------------------------------