2012-04-04 9 views
9

私は、ニュース記事のリストをページングするために使用している次のSPを持っています。あなたが推測できるかもしれないので、@startは(内部クエリによってソートされた)行を選択するインデックスであり、@orderbyはソートする列を示し、@orderdirは1つの方向をソートするかどうかを示します。その他。元のクエリは、パラメータを追加する前に、 hereでした。ストアドプロシージャのパラメータとしてのDESCおよびASC

ALTER PROCEDURE [mytable].[news_editor_paginate] 
    @count int, 
    @start int, 
    @orderby int, 
    @orderdir int 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT TOP (@count) * FROM 
    ( 
     SELECT ne.*,n.publishstate, 
      (CASE WHEN @orderdir = 1 THEN 
       ROW_NUMBER() OVER (
        ORDER BY      
         CASE WHEN @orderby = 0 THEN ne.[time] END DESC, 
         CASE WHEN @orderby = 1 THEN ne.lastedit END DESC,  
         CASE WHEN @orderby = 2 THEN ne.title END ASC 
        ) 
      WHEN @orderdir = 2 THEN 
       ROW_NUMBER() OVER (
        ORDER BY      
         CASE WHEN @orderby = 0 THEN ne.[time] END ASC,  
         CASE WHEN @orderby = 1 THEN ne.lastedit END ASC, 
         CASE WHEN @orderby = 2 THEN ne.title END DESC 
        ) 
       END 
      ) AS num 
      FROM news_edits AS ne 
      LEFT OUTER JOIN news AS n 
      ON n.editid = ne.id 
     ) 
    AS a 
    WHERE num > @start 
END 

今は何も実際にはうまくいかなかったが、@orderbyパラメータが動作しません。 @orderdirパラメータに1を指定すると、そのパラメータとして2を指定した場合と全く同じ結果が得られます。

答えて

15

行番号はすべての行で評価されませんが、大文字と小文字のステートメントは大文字小文字の区別にかかわらずローブに固執しています。

代わりにこれを試してみてください:

  ROW_NUMBER() OVER (
       ORDER BY      
        CASE WHEN @orderby = 0 AND @orderdir = 1 THEN ne.[time] END DESC,  
        CASE WHEN @orderby = 0 AND @orderdir = 2 THEN ne.[time] END ASC,  
        CASE WHEN @orderby = 1 AND @orderdir = 1 THEN ne.lastedit END DESC, 
        CASE WHEN @orderby = 1 AND @orderdir = 2 THEN ne.lastedit END ASC, 
        CASE WHEN @orderby = 2 AND @orderdir = 1 THEN ne.title END ASC 
        CASE WHEN @orderby = 2 AND @orderdir = 2 THEN ne.title END DESC 
       ) 
+1

うんを、それはそれほど明白と思われますあなたはそれを書きました。ありがとう、答えとしてマークするのを待つ必要があります。 –

+0

汗がかからない。 row_numberが出てくる前に、何回かこの物に頭を傷つけました。 – Gats

1

これが私のために正常に動作します - (ここで、順方向、によって、オフセットフェッチ)私が望んでいた正確にどのように働いていた

 -- parameters 

     @orderColumn int , 
     @orderDir varchar(20), 
     @start int , 
     @limit int 


     select * from items 
     WHERE  (items.status = 1) 
     order by 

     CASE WHEN @orderColumn = 0 AND @orderdir = 'desc' THEN items.[category] END DESC,  
     CASE WHEN @orderColumn = 0 AND @orderdir = 'asc' THEN items.[category] END ASC,  
     CASE WHEN @orderColumn = 1 AND @orderdir = 'desc' THEN items.[category] END DESC, 
     CASE WHEN @orderColumn = 1 AND @orderdir = 'asc' THEN items.[category] END ASC, 
     CASE WHEN @orderColumn = 2 AND @orderdir = 'desc' THEN items.[category] END DESC, 
     CASE WHEN @orderColumn = 2 AND @orderdir = 'asc' THEN items.[category] END ASC 

     OFFSET @start ROWS FETCH NEXT @limit ROWS ONLY 
関連する問題