2012-04-04 24 views
9

Tôi có SP sau mà tôi đang sử dụng để phân trang danh sách các bài báo. Như bạn có thể đoán, @count là số hàng cần trả về, @start là chỉ mục để chọn các hàng từ (được sắp xếp theo truy vấn bên trong), @orderby cho biết cột cần sắp xếp theo và @orderdir cho biết có sắp xếp một hướng hay không khác. Truy vấn ban đầu của tôi là here, trước khi tôi thêm thông số @orderdir.DESC và ASC làm tham số trong thủ tục lưu sẵn

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 

Hiện tại không có gì sai, nhưng thông số @orderby không hoạt động. Nếu cung cấp 1 làm thông số @orderdir, nó sẽ cho tôi kết quả chính xác giống như nếu tôi cung cấp 2 làm tham số đó.

Trả lời

15

Số hàng không được đánh giá trên mỗi hàng, tuy nhiên các trường hợp báo cáo là do đó bạn bị mắc kẹt với cuộc biểu tình bất kể trường hợp đó là gì.

Hãy thử điều này thay vì:

  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 mà làm việc một cách chính xác làm thế nào tôi muốn, có vẻ như quá rõ ràng bây giờ bạn đã viết nó xuống. Cảm ơn, phải đợi để đánh dấu câu trả lời này là câu trả lời. –

+0

Không đổ mồ hôi. Trầy xước đầu của tôi về công cụ này một vài lần trước khi row_number xuất hiện. – Gats

1

này hoạt động tốt đối với tôi - (nơi, trật tự do, chỉ đạo, bù đắp lấy)

 -- 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 
Các vấn đề liên quan