Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

OFFSET/FETCH का उपयोग कर SQL सर्वर में पेजिनेशन

पेजिनेशन अक्सर उन अनुप्रयोगों में उपयोग किया जाता है जहां उपयोगकर्ता पिछला . पर क्लिक कर सकता है /अगला परिणाम बनाने वाले पृष्ठों को नेविगेट करने के लिए, या किसी विशिष्ट पृष्ठ पर सीधे जाने के लिए पृष्ठ संख्या पर क्लिक करें।

SQL सर्वर में क्वेरी चलाते समय, आप OFFSET . का उपयोग करके परिणामों को पृष्ठांकित कर सकते हैं और FETCH ORDER BY . के तर्क खंड। ये तर्क SQL Server 2012 में पेश किए गए थे, इसलिए यदि आपके पास SQL ​​Server 2012 या उच्चतर है तो आप इस तकनीक का उपयोग कर सकते हैं।

इस संदर्भ में, पेजिनेशन वह जगह है जहां आप क्वेरी परिणामों को छोटे टुकड़ों में विभाजित करते हैं, प्रत्येक खंड जारी रहता है जहां पिछला समाप्त होता है। उदाहरण के लिए, यदि कोई क्वेरी 1000 पंक्तियों को लौटाती है, तो आप उन्हें पृष्ठांकित कर सकते हैं ताकि वे 100 के समूहों में वापस आ जाएं। एक एप्लिकेशन पृष्ठ संख्या और पृष्ठ आकार को SQL सर्वर पर भेज सकता है, और SQL सर्वर तब इसका उपयोग केवल वापस करने के लिए कर सकता है अनुरोधित पृष्ठ के लिए डेटा।

उदाहरण 1 - कोई पेजिनेशन नहीं

सबसे पहले, एक क्वेरी चलाते हैं जो तालिका में सभी पंक्तियों को लौटाती है:

 GenreId द्वारा * GenresORDER से चुनें;

परिणाम:

+-----------+-----------+| GenreId | शैली ||-----------+-----------|| 1 | रॉक || 2 | जैज़ || 3 | देश || 4 | पॉप || 5 | ब्लूज़ || 6 | हिप हॉप || 7 | रैप || 8 | पंक |+----------+------------+

यह उदाहरण बिना पेजिनेशन का उपयोग करता है - सभी परिणाम प्रदर्शित होते हैं।

यह परिणाम सेट इतना छोटा है कि इसे सामान्य रूप से पृष्ठ पर अंक लगाने की आवश्यकता नहीं होगी, लेकिन इस लेख के प्रयोजनों के लिए, आइए इसे पृष्ठांकित करें।

उदाहरण 2 - पहले 3 परिणाम प्रदर्शित करें

यह उदाहरण पहले तीन परिणाम प्रदर्शित करता है:

 GenreId OFFSET द्वारा * GenreId OFFSET द्वारा GenresORDER से चुनें 0 पंक्तियाँ केवल अगली 3 पंक्तियाँ प्राप्त करें;

परिणाम:

+-----------+-----------+| GenreId | शैली ||-----------+-----------|| 1 | रॉक || 2 | जैज़ || 3 | देश |+----------+-----------+

इस मामले में, मैं निर्दिष्ट करता हूं कि परिणाम पहले परिणाम से शुरू होने चाहिए और अगली तीन पंक्तियों को प्रदर्शित करना चाहिए। यह निम्नलिखित का उपयोग करके किया जाता है:

  • OFFSET 0 ROWS निर्दिष्ट करता है कि कोई ऑफ़सेट नहीं होना चाहिए (शून्य का ऑफ़सेट)।
  • FETCH NEXT 3 ROWS ONLY ऑफ़सेट से अगली तीन पंक्तियाँ प्राप्त करता है। चूंकि मैंने शून्य का ऑफसेट निर्दिष्ट किया है, इसलिए पहली तीन पंक्तियां प्राप्त की जाती हैं।

यदि हम केवल शीर्ष 3 परिणाम चाहते थे, तो हम TOP का उपयोग करके वही परिणाम प्राप्त कर सकते थे ऑफसेट और फ़ेच मान निर्दिष्ट करने के बजाय खंड। हालांकि, इससे हमें अगला भाग करने की अनुमति नहीं मिलती।

उदाहरण 3 - अगले 3 परिणाम प्रदर्शित करें

अब अगले तीन परिणाम प्रदर्शित करते हैं:

GenreId OFFSET द्वारा * GenreId OFFSET द्वारा Genresorder से चुनें केवल अगली 3 पंक्तियाँ प्राप्त करें;

परिणाम:

+-----------+-----------+| GenreId | शैली ||-----------+-----------|| 4 | पॉप || 5 | ब्लूज़ || 6 | हिप हॉप |+-----------+-----------+

तो केवल एक चीज जो मैंने बदली वह थी ऑफसेट।

ऑफ़सेट और फ़ेचिंग मान एक चर, पैरामीटर, या निरंतर स्केलर सबक्वेरी के रूप में प्रदान की गई अभिव्यक्ति भी हो सकते हैं। जब एक सबक्वेरी का उपयोग किया जाता है, तो यह बाहरी क्वेरी स्कोप में परिभाषित किसी भी कॉलम को संदर्भित नहीं कर सकता है (इसे बाहरी क्वेरी के साथ सहसंबद्ध नहीं किया जा सकता है)।

निम्नलिखित उदाहरण परिणामों को पृष्ठांकित करने के दो तरीकों को दिखाने के लिए अभिव्यक्तियों का उपयोग करते हैं।

उदाहरण 4 - पंक्ति संख्या द्वारा पृष्ठ पर अंक लगाना

यह उदाहरण पंक्ति . को निर्दिष्ट करने के लिए व्यंजकों का उपयोग करता है शुरू करने के लिए नंबर।

घोषणा @StartRow int =1, @RowsPerPage int =3; GenreId ASC OFFSET @StartRow द्वारा GenresORDER से * चुनें 

परिणाम:

+-----------+-----------+| GenreId | शैली ||-----------+-----------|| 1 | रॉक || 2 | जैज़ || 3 | देश |+----------+-----------+

यहाँ, मैं उपयोग करता हूँ @StartRow int = 1 यह निर्दिष्ट करने के लिए कि परिणाम पहली पंक्ति से शुरू होने चाहिए।

अगर मैं उस मान को 2 . तक बढ़ा दूं तो क्या होगा ।

DECLARE @StartRow int =2, @RowsPerPage int =3; GenreId ASC OFFSET @StartRow द्वारा GenresORDER से * चुनें 

परिणाम:

+-----------+-----------+| GenreId | शैली ||-----------+-----------|| 2 | जैज़ || 3 | देश || 4 | पॉप |+-----------+------------+

यह दूसरी पंक्ति से शुरू होता है। इस पद्धति का उपयोग करके, मैं शुरू करने के लिए सटीक पंक्ति निर्दिष्ट कर सकता हूं।

उदाहरण 5 - पेज नंबर द्वारा पेजिनेशन

यह उदाहरण पिछले उदाहरण के लगभग समान है, सिवाय इसके कि यह आपको पंक्ति संख्या के विपरीत पृष्ठ संख्या निर्दिष्ट करने की अनुमति देता है।

DECLARE @PageNumber int =1, @RowsPerPage int =3; GenreId ASC OFFSET (@PageNumber - 1) द्वारा GenreId ASC OFFSET द्वारा * GenresOrder से चुनें * @RowsPerPage ROWS FETCH NEXT @RowsPerPage ROWS केवल;

परिणाम:

+-----------+-----------+| GenreId | शैली ||-----------+-----------|| 1 | रॉक || 2 | जैज़ || 3 | देश |+----------+-----------+

तो पहला परिणाम वही है। हालांकि, देखते हैं कि जब हम @PageNumber को बढ़ाते हैं तो क्या होता है करने के लिए 2 (मैंने इसके नए उद्देश्य को दर्शाने के लिए इस चर का नाम बदल दिया)।

DECLARE @PageNumber int =2, @RowsPerPage int =3; GenreId ASC OFFSET (@PageNumber - 1) द्वारा GenreId ASC OFFSET द्वारा * GenresOrder से चुनें * @RowsPerPage ROWS FETCH NEXT @RowsPerPage ROWS केवल;

परिणाम:

+-----------+-----------+| GenreId | शैली ||-----------+-----------|| 4 | पॉप || 5 | ब्लूज़ || 6 | हिप हॉप |+-----------+-----------+

इस बार परिणाम चौथी पंक्ति से शुरू होते हैं। तो इस पद्धति का उपयोग करके आप केवल पंक्ति संख्या के बजाय पृष्ठ संख्या पास कर सकते हैं।

उदाहरण 6 - पेजिनेशन लूप

समाप्त करने के लिए, यहां एक त्वरित उदाहरण दिया गया है जो सभी पृष्ठों के माध्यम से लूप करता है और प्रत्येक पुनरावृत्ति के लिए प्रारंभिक पंक्ति संख्या निर्दिष्ट करता है:

घोषणा @StartRow int =1, @RowsPerPage int =3;जबकि (शैलियों से COUNT(*) चुनें)>=@StartRow BEGIN SELECT * से GenreId ASC OFFSET @StartRow - 1 पंक्तियाँ अगला @RowsPerPage पंक्तियाँ प्राप्त करें केवल;सेट @StartRow =@StartRow + @RowsPerPage; जारी रखें;

परिणाम:

+-----------+-----------+| GenreId | शैली ||-----------+-----------|| 1 | रॉक || 2 | जैज़ || 3 | देश |+----------+------------+(3 पंक्तियाँ प्रभावित)+---------------+---------- --+| GenreId | शैली ||-----------+-----------|| 4 | पॉप || 5 | ब्लूज़ || 6 | हिप हॉप |+-----------+------------+(3 पंक्तियाँ प्रभावित)+---------------+------ ---+| GenreId | शैली ||-----------+-----------|| 7 | रैप || 8 | पंक |+-----------+------------+(2 पंक्तियाँ प्रभावित)

उदाहरण 7 - ROW बनाम ROWS

यदि आपको ऐसे कोड का सामना करना पड़ता है जो ROW . का उपयोग करता है ROWS . के बजाय , दोनों तर्क एक ही काम करते हैं। वे समानार्थी हैं और एएनएसआई संगतता के लिए प्रदान किए जाते हैं।

यहां इस पृष्ठ पर पहला उदाहरण दिया गया है, लेकिन ROW . के साथ ROWS . के बजाय ।

GenreId OFFSET द्वारा * GenreId OFFSET द्वारा GenresORDER से चुनें 0 रो फ़ेच नेक्स्ट 3 रो केवल;

परिणाम:

+-----------+-----------+| GenreId | शैली ||-----------+-----------|| 1 | रॉक || 2 | जैज़ || 3 | देश |+----------+-----------+

उदाहरण 8 - पहला बनाम अगला

वही FIRST . पर लागू होता है और NEXT . ये ANSI संगतता के लिए उपलब्ध कराए गए समानार्थक शब्द हैं।

यहां पिछला उदाहरण दिया गया है लेकिन FIRST . के साथ इसके बजाय NEXT

GenreId OFFSET द्वारा * GenreId OFFSET द्वारा GenresORDER से चुनें 0 ROW FETCH FIRST 3 ROW केवल;

परिणाम:

+-----------+-----------+| GenreId | शैली ||-----------+-----------|| 1 | रॉक || 2 | जैज़ || 3 | देश |+----------+-----------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर एक्सप्रेस बैकअप डेटाबेस | SQL एक्सप्रेस बैकअप को स्वचालित और पर्ज कैसे शेड्यूल करें

  2. अंतिम सम्मिलित पंक्ति आईडी प्राप्त करें (SQL कथन के साथ)

  3. चर के लिए गतिशील एसक्यूएल का परिणाम असाइन करें

  4. AT TIME ZONE - SQL Server 2016 में एक नई पसंदीदा विशेषता

  5. कैसे ठीक करें "अमान्य वस्तु का नाम 'OPENJSON'।" SQL सर्वर में