2014-07-23 92 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) 
---------------------------------------------------