2009-04-15 72 views
3

我想在存儲過程中使用動態順序,所以我可以傳遞我想要返回到存儲過程的數據作爲參數的順序。這爲VARCHAR領域工作正常但是如果我嘗試如下SQL Server的動態順序通過

DECLARE @ORDERBY INT 
SET @ORDERBY = 1 
SELECT TOP 10 * FROM TBL_LMS_USERS_RECORDs_LAST_ATTEMPT 
ORDER BY 
CASE 
    WHEN @OrderBy = 1 THEN s10_record_dow 
    --WHEN @OrderBy = 2 THEN pk_big_record_id 
    else s10_record_dow 
END 

如果我取消了第二當case語句它的錯誤與

int或時間字段是錯誤,我有代碼進行排序「

」將數據類型varchar轉換爲bigint時出錯。

如果我不使用case語句,我可以按這個字段排序。

任何想法?

回答

8

它改成這樣:

SELECT TOP 10 * FROM TBL_LMS_USERS_RECORDs_LAST_ATTEMPT 
ORDER BY 
    CASE WHEN @OrderBy = 1 THEN s10_record_dow ELSE NUll END, 
    CASE WHEN @OrderBy = 2 THEN pk_big_record_id ELSE NULL END, 
    CASE WHEN @OrderBy <> 1 AND @OrderBy <> 2 THEN s10_record_dow 
     ELSE NULL 
    END 
+0

感謝,似乎工作,出於興趣爲什麼它的工作好,我是如何用VARCHAR,但爲了使用INT或其他數據類型我有它有這樣的方式? – Gavin 2009-04-15 13:30:56

3

爲什麼不使用ROW_NUMBER()?

SELECT TOP 10 
     *, 
     CASE @SortBy 
     WHEN 'A' THEN ROW_NUMBER() OVER (ORDER BY s10_record_dow) 
     WHEN 'B' THEN ROW_NUMBER() OVER (ORDER BY pk_id) 
     END RowNumber 
FROM TBL_LMS_USERS_RECORDs_LAST_ATTEMPT 

然後,您訂購的列可以是任何類型。

0
order by 
(case when (@orderByAsc = 1) then r.SomeColumn end) asc, 
(case when (@orderByAsc = 0) then r.SomeColumn end) desc 

這是你如何讓ascening或descening