2012-04-04 15 views
9

Mam następujące SP, które używam do paginacji listy artykułów z wiadomościami. Jak możesz być w stanie odgadnąć, @count to liczba wierszy do zwrócenia, @start jest indeksem do wybrania wierszy od (posortowane według zapytania wewnętrznego), @orderby wskazuje kolumnę do posortowania według, a @orderdir wskazuje czy sortować jeden kierunek czy inny. Moje pierwotne zapytanie to here, zanim dodałem parametr @orderdir.DESC i ASC jako parametr w procedurze przechowywanej

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 

Teraz nic się nie dzieje, ale parametr @orderby nie działa. Jeśli podasz 1 jako parametr @orderdir, otrzymam dokładnie takie same wyniki, jak gdybym podał 2 jako ten parametr.

Odpowiedz

15

Numer wiersza nie jest oceniany w każdym wierszu, jednak instrukcje na temat sprawy są takie, że utknąłeś z rownum bez względu na okoliczności.

Spróbuj to zamiast:

  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

yup, który działał dokładnie tak, jak chciałem, wydaje się więc oczywiste, teraz, kiedy to zapisałeś. Dzięki, musicie poczekać, aby oznaczyć to jako odpowiedź. –

+0

Bez potu. Podrapałam się w głowę nad tym materiałem kilka razy, zanim pojawił się numer_wiersza. – Gats

1

Działa to dobrze dla mnie - (gdzie, uporządkuj, kierunek przesunięcia pobrać)

 -- 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 
Powiązane problemy