2012-04-04 14 views
9

Ho il seguente SP che sto usando per impaginare un elenco di articoli di notizie. Come potresti essere in grado di indovinare, @count è il numero di righe da restituire, @start è l'indice per selezionare le righe da (ordinate per query interna), @orderby indica la colonna da ordinare e @orderdir indica se ordinare una direzione o il altro. La mia query originale era here, prima di aggiungere il parametro @orderdir.DESC e ASC come parametro nella stored procedure

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 

Ora, nulla in realtà va male, ma il parametro @orderby non funziona. Se fornisci 1 come parametro @orderdir, mi darà esattamente gli stessi risultati come se fornissi 2 come parametro.

risposta

15

Il numero di riga non viene valutato su ogni riga, tuttavia le dichiarazioni dei casi sono così che sei bloccato con il rownum indipendentemente dal caso.

Prova a modificare:

  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 che ha funzionato esattamente come volevo, mi sembra così ovvio ora che l'hai scritto. Grazie, devo aspettare per segnare questo come risposta. –

+0

Nessun problema. Mi sono grattato la testa un po 'di volte prima che uscisse row_number. – Gats

1

Questo funziona bene per me - (dove, ORDER BY, la direzione, l'offset prendere)

 -- 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 
Problemi correlati