2012-04-04 19 views
9

मेरे पास निम्न एसपी है जिसका उपयोग मैं समाचार लेखों की एक सूची को पेजेट करने के लिए कर रहा हूं। जैसा कि आप अनुमान लगाने में सक्षम हो सकते हैं, @count वापस आने वाली पंक्तियों की संख्या है, @start पंक्तियों का चयन करने के लिए सूचकांक है (आंतरिक क्वेरी द्वारा क्रमबद्ध), @orderby कॉलम को क्रमबद्ध करने के लिए इंगित करता है, और @orderdir इंगित करता है कि एक दिशा को सॉर्ट करना है या नहीं अन्य। @orderdir पैरामीटर जोड़ने से पहले, मेरी मूल क्वेरी here थी।संग्रहित प्रक्रिया में पैरामीटर के रूप में डीईएससी और एएससी

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 

अब कुछ भी गलत नहीं है, लेकिन @orderby पैरामीटर काम नहीं करता है। यदि @orderdir पैरामीटर के रूप में 1 प्रदान करते हैं, तो यह मुझे वही परिणाम देगा जैसे कि मैं 2 पैरामीटर के रूप में प्रदान करता हूं।

उत्तर

15

पंक्ति संख्या का मूल्यांकन प्रत्येक पंक्ति पर नहीं किया जाता है, हालांकि केस स्टेटमेंट्स हैं इसलिए आप राउनम से फंस गए हैं इससे कोई फर्क नहीं पड़ता कि मामला क्या है।

ऐसा करें:

  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

हाँ कि वास्तव में काम किया मैं कैसे करना चाहता था, यह बहुत स्पष्ट लगता अब आपने इसे लिखा है। धन्यवाद, इसे उत्तर के रूप में चिह्नित करने के लिए प्रतीक्षा करनी है। –

+0

कोई पसीना नहीं। पंक्ति_नंबर बाहर आने पर कुछ बार पहले इस सामान पर मेरे सिर को खरोंच कर दिया। – Gats

1

यह मेरे लिए ठीक काम करता है - (जहां, आदेश दिशा से,, ऑफसेट लाने)

 -- 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 
संबंधित मुद्दे