2012-04-04 14 views
9

Ich habe den folgenden SP, den ich verwende, um eine Liste von Nachrichtenartikeln zu paginieren. Wie Sie vielleicht erraten können, ist @count die Anzahl der Zeilen, die zurückgegeben werden, @start ist der Index zum Auswählen von Zeilen aus (sortiert nach innerer Abfrage), @orderby gibt die zu sortierende Spalte an, und @orderdir gibt an, ob eine Richtung oder die andere. Meine ursprüngliche Abfrage war here, bevor ich den Parameter @orderdir hinzugefügt habe.DESC und ASC als Parameter in der gespeicherten Prozedur

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 

Jetzt geht eigentlich nichts falsch, aber die @orderby Parameter funktionieren nicht. Wenn 1 als @orderdir Parameter angegeben wird, gibt es mir genau die gleichen Ergebnisse, als ob ich 2 als diesen Parameter bereitstellen würde.

Antwort

15

Die Reihennummer wird nicht in jeder Zeile ausgewertet, aber Fallanweisungen sind so, dass Sie in jedem Fall im Rownum stecken bleiben.

Versuchen Sie stattdessen:

  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, das genau funktioniert, wie ich wollte, es scheint so offensichtlich, jetzt, wo du es niedergeschrieben hast. Danke, warten müssen, um dies als die Antwort zu markieren. –

+0

Kein Schweiß. Ich habe mir ein paar Mal zuvor den Kopf über dieses Zeug gekratzt, als Row Number herauskam. – Gats

1

Dies funktioniert gut für mich - (wo, um durch, Richtung, Offset holen)

 -- 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 
Verwandte Themen