2012-08-22 50 views
4

嗨下面的查詢是一個更大的複雜查詢的原型 問題是,我應該能夠排序任何順序(即ASC和DESC) 。用戶輸入如何排序日期時間在ROW_NUMBER()OVER(ORDER BY子句

CREATE table #Table1(
Name varchar(10) PRIMARY key, 
DOB DateTime, 
Rate numeric(10,2) 
) 

INSERT INTO #Table1 (Name,DOB,Rate) values ('Name1','2/2/2012',10.23) 
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name2','3/2/2012',120.23) 
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name3','4/2/2012',110.23) 
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name4','5/2/2012',140.23) 
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name15','6/2/2012',130.23) 
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name6','2/21/2012',1120.23) 

Declare @SortColumn varchar(10) 
DECLARE @SortExpression varchar (10) 

SET @SortColumn = 'DOB' 
SET @SortExpression = 'DESC' -- Need to sort in both ASC and DESC 

Select 
      Name, 
      DOB, 
      Rate, 
      ROW_NUMBER() OVER 
       (ORDER BY 
        CASE WHEN @SortColumn = 'Name' then Name 
         WHEN @SortColumn = 'DOB' THEN DOB 
         WHEN @SortColumn = 'Rate' THEN Rate 
        END + @SortExpression 
       ) AS RowNumber 
       FROM 
       #Table1 
+0

你有什麼錯誤? – Vikdor

+0

[請參閱此處的答案](http://stackoverflow.com/a/1479623/73226)。單獨的查詢可能會有更好的計劃。 BTW'ASC'和'DESC'不能在你嘗試的時候進行校準,並且'CASE'的所有分支都需要被轉換爲相同的數據類型。 –

回答

2

看起來你需要CAST()CONVERT()CASE的項目,以得到它的工作:

Declare @SortColumn varchar(10) 
DECLARE @SortExpression varchar (10) 

SET @SortColumn = 'DOB' 
SET @SortExpression = 'DESC' -- Need to sort in both ASC and DESC 

Select 
    Name, 
    DOB, 
    Rate, 
    ROW_NUMBER() OVER 
    (ORDER BY 
     CASE WHEN @SortColumn = 'Name' then Name 
      WHEN @SortColumn = 'DOB' THEN convert(char(10), DOB, 120) 
      WHEN @SortColumn = 'Rate' THEN Cast(Rate as varchar(10)) 
     END ASC 
    ) AS RowNumberASC, 
    ROW_NUMBER() OVER 
    (ORDER BY 
     CASE WHEN @SortColumn = 'Name' then Name 
      WHEN @SortColumn = 'DOB' THEN convert(char(10), DOB, 120) 
      WHEN @SortColumn = 'Rate' THEN Cast(Rate as varchar(10)) 
     END DESC 
    ) AS RowNumberDESC 
FROM Table1 

SQL Fiddle with Demo

正如@馬丁指出ASC,DESC不能參數化。

+0

'+ @ SortExpression'只是將'ASC' /'DESC'附加到已排序的字符串。它仍然是排序'ASC' –

+0

@MartinSmith我沒有意識到這一點。從我的答案中刪除。謝謝 – Taryn

+0

@PeterLang切換到轉換'yyyy-mm-dd' – Taryn

0

如果您需要動態地在ASCDESC之間切換,則必須使用動態語句。
SQL小提琴here。請注意0​​!

EXECUTE(' SELECT Name, DOB, Rate,' 
     + ' ROW_NUMBER() OVER(ORDER BY ' + @SortColumn + ' ' + @SortExpression 
     + ') AS RowNumber' 
     + ' FROM Table1'); 

如果查詢是複雜的,可以考慮把它變成一個視圖,並從該視圖中選擇,以允許部分的編譯時檢查。

+0

你將無法在視圖中使用動態sql,但它必須是存儲過程。 – Taryn

+0

是的,恐怕沒有辦法在視圖中放置'ASC'/'DESC'。 –