2009-04-15 22 views
3

ストアドプロシージャで動的順序を使用しようとしていますので、データをストアドプロシージャにパラメータとして返す順序を渡すことができます。私はSQL Server動的注文By

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 

を次のように私は

とWHEN case文のそれ誤差の第二のコメントを解除した場合、私が持っているコードがあるintまたは日時フィールド、それがエラーを並べ替えしようとした場合しかし、これは、VARCHARフィールドのため正常に動作します

"データ型varcharをbigintに変換中にエラーが発生しました。

ケースステートメントを使用しないと、このフィールドで問題なく注文できます。

アイデア?これに

答えて

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

感謝をdesceningか、関心の外に、なぜそれは私がVARCHARでなく、INTまたは私が持っている他のデータ型を使用するためにそれを持っていたどのように[OK]を働いていましたさこのようにするには? – Gavin

+1

ケース内のすべてのフィールドを同じデータ型に評価する必要があります。ただし、リスト内のすべてのフィールドを単一のデータ型に変換できる場合は、単一のCase文を使用できます。ケース内のそのデータ型 –

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を取得したり、動作しているようです