2012-04-04 14 views
9

Haber makalelerinin bir listesini görüntülemek için kullanıyorum şu SP'ye sahibim. Tahmin edebileceğiniz gibi, @count döndürecek satır sayısıdır, @start satırları (iç sorguya göre sıralanır) satır seçmek için dizin, @orderby sıralamak için sütunu gösterir ve @orderdir bir yönünü veya sıralamak için diğer. Orijinal sorgum @orderdir parametresini eklemeden önce here oldu.Saklı yordamda bir parametre olarak DESC ve 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 

Artık hiçbir şey yanlış gitmiyor, ancak @orderby parametresi çalışmıyor. @orderdir parametresi olarak 1 sağlarsanız, bu parametreyi 2 olarak sağladığımla aynı sonuçları verir.

cevap

15

Satır numarası her satırda değerlendirilmez, ancak büyük/küçük harf ifadeleri böyledir, bu durumda durum ne olursa olsun.

yerine bu deneyin:

  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

Evet, bu kadar açık gözüküyor şimdi yazdın. Teşekkürler, bunu cevap olarak işaretlemek için beklemek zorunda. –

+0

Ter yok. Row_number'in çıkmasından birkaç kez önce kafamı bu şeylerin üzerine çizdim. – Gats

1

Bu benim için çalışıyor - (burada, sipariş yönünde tarafından, ofset getirme) istediğim tam olarak nasıl çalıştığı

 -- 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 
İlgili konular