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

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

एक डेटाबेस में सैकड़ों हजारों रिकॉर्ड हो सकते हैं। SQL सर्वर या MySQL आदि जैसे डेटाबेस प्रबंधन प्रणालियों के माध्यम से इन रिकॉर्ड्स को सम्मिलित करना और चुनना आसान है। हालांकि, एक वेबपेज या डेस्कटॉप एप्लिकेशन में हजारों रिकॉर्ड प्रदर्शित करना आसान नहीं है। जगह और मेमोरी की कमी के कारण बड़ी संख्या में रिकॉर्ड एक साथ प्रदर्शित करना मुश्किल हो जाता है।

ऐसी समस्या का एक सामान्य समाधान पेजिंग को लागू करना है। (ध्यान दें, यह ऑपरेटिंग सिस्टम द्वारा कार्यान्वित मेमोरी पेजिंग नहीं है) प्रोग्रामिंग में पेजिंग से तात्पर्य पृष्ठों की एक श्रृंखला के माध्यम से डेटा प्रदर्शित करना है। एक यादृच्छिक Google खोज के परिणामस्वरूप हजारों परिणाम हो सकते हैं। Google इन परिणामों को प्रदर्शित करने के लिए पेजिंग का उपयोग करता है। यदि आप खोज परिणामों के साथ Google पृष्ठ को नीचे स्क्रॉल करते हैं तो आपको निम्नलिखित दिखाई देंगे:

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

इस लेख में, हम देखेंगे कि कैसे OFFSET FETCH NEXT ऑपरेटरों का उपयोग फ्रंट-एंड एप्लिकेशन पर पेजिंग को लागू करने के लिए किया जा सकता है। हम OFFSET FETCH NEXT ऑपरेटर का उपयोग करके एक सरल उदाहरण के साथ शुरू करेंगे और फिर देखेंगे कि इसे संग्रहीत प्रक्रिया की मदद से व्यावहारिक रूप से कैसे उपयोग किया जा सकता है।

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

SQL सर्वर में पेजिंग को लागू करने के लिए OFFSET और NEXT ऑपरेटर होते हैं। OFFSET ऑपरेटर शुरुआत से खोज परिणामों की अगली K संख्या को ऑफ़सेट करता है, जबकि FETCH NEXT ऑपरेटर NEXT N परिणाम प्राप्त करता है जहाँ K और N पूर्णांक होते हैं।

डमी डेटा तैयार करना

इससे पहले कि हम OFFSET FETCH NEXT को क्रिया में देखें, आइए 200 रिकॉर्ड के साथ एक डमी डेटाबेस बनाएं। आप एक काम कर रहे डेटाबेस का उपयोग कर सकते हैं यदि आप 100% आश्वस्त हैं कि इसका ठीक से बैकअप लिया गया है। ऐसा करने के लिए निम्न स्क्रिप्ट निष्पादित करें:

CREATE Database ShowRoom;
GO
USE ShowRoom;

CREATE TABLE Cars
(
id INT PRIMARY KEY IDENTITY,
name VARCHAR(50) NOT NULL,
company VARCHAR(50) NOT NULL,
power INT NOT NULL
)

ऊपर की स्क्रिप्ट में हम कार नामक एक टेबल के साथ एक डमी डेटाबेस शोरूम बनाते हैं। आइए इस डेटाबेस में कुछ डमी रिकॉर्ड जोड़ें। निम्न स्क्रिप्ट निष्पादित करें:

 USE ShowRoom
DECLARE @count INT
SET @count = 1

DECLARE @carname VARCHAR (50)
DECLARE @company_name VARCHAR (50)

 WHILE (@count <= 200)
 BEGIN
	  SET @carname = 'Car - ' + LTRIM(@count)
	  SET @company_name = 'Company - '+ LTRIM(@count)
	  INSERT INTO Cars VALUES (@carname, @company_name, @count * 5)
	  SET @count = @count + 1
END

उपरोक्त लिपि को ध्यान से देखें। उपरोक्त स्क्रिप्ट कार्स टेबल में 200 डमी रिकॉर्ड सम्मिलित करती है। स्क्रिप्ट 200 पुनरावृत्तियों के लिए थोड़ी देर के लूप का उपयोग करती है। प्रत्येक पुनरावृत्ति 'कार -' शब्द को पुनरावृत्ति संख्या में जोड़ता है और परिणाम कार तालिका के नाम कॉलम में डाला जाता है। इसी तरह, "कंपनी -" शब्द को पुनरावृत्ति संख्या के साथ जोड़ा जाता है और प्रत्येक पुनरावृत्ति में कंपनी कॉलम में डाला जाता है। अंत में, प्रत्येक पुनरावृत्ति के साथ, पुनरावृत्ति संख्या को 5 से गुणा किया जाता है और परिणाम को पावर कॉलम में डाला जाता है। अब यदि आप कार तालिका से सभी रिकॉर्ड का चयन करते हैं तो आपको परिणाम सेट में 200 रिकॉर्ड दिखाई देंगे। ऐसा करने के लिए निम्न क्वेरी निष्पादित करें:

SELECT * FROM Cars

उपरोक्त क्वेरी के आंशिक परिणाम का स्क्रीनशॉट इस प्रकार है। आप परिणाम में 200 पंक्तियाँ देख सकते हैं।

ऑफसेट फ़ेच अगला उदाहरण

आइए अब OFFSET NEXT को क्रिया में देखें। OFFSET NEXT का सिंटैक्स इस प्रकार है:

SELECT * FROM Table_Name
ORDER BY COLUMN_NAME/S
OFFSET Number_of_rows_to_Skip ROWS
FETCH NEXT Number_of_rows_to_Fetch ROWS ONLY

यहां यह उल्लेख करना महत्वपूर्ण है कि आपको OFFSET FETCH NEXT क्लॉज के साथ ORDER BY क्लॉज का उपयोग करना होगा।

आइए OFFSET FETCH NEXT का एक सरल उदाहरण देखें जहां हम Cars टेबल के id कॉलम द्वारा डेटा को ऑर्डर करेंगे, पहली 20 पंक्तियों को छोड़ देंगे, और अगली 10 पंक्तियों को प्राप्त करेंगे। निम्न स्क्रिप्ट निष्पादित करें:

USE ShowRoom
SELECT * FROM Cars
ORDER BY id
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

उपरोक्त स्क्रिप्ट के आउटपुट में, आप 21 से 30 के आईडी मान वाले रिकॉर्ड देखेंगे क्योंकि हमने पहले 20 रिकॉर्ड को छोड़ दिया और अगले 10 को प्राप्त किया।

संग्रहीत प्रक्रिया के साथ OFFSET FETCH NEXT का उपयोग करना

यदि आप किसी वेबसाइट या डेस्कटॉप एप्लिकेशन जैसे फ्रंट एंड एप्लिकेशन में पेजिंग लागू कर रहे हैं, तो आप आमतौर पर एक संग्रहीत प्रक्रिया के माध्यम से सर्वर को पेज नंबर और पेज साइज मान भेजेंगे। पृष्ठ संख्या और पृष्ठ आकार के मूल्य के आधार पर, संग्रहीत कार्यविधि पंक्तियों का सही सेट लौटाएगी। आइए एक ऐसी संग्रहीत प्रक्रिया लिखें जो पृष्ठ संख्या और पृष्ठ आकार को पैरामीटर के रूप में लेती है और संबंधित रिकॉर्ड लौटाती है।

निम्नलिखित स्क्रिप्ट पर एक नज़र डालें:

USE ShowRoom
GO
CREATE PROC spGetRecordsByPageAndSize
@Page INT,
@Size INT
AS
BEGIN
	SELECT * FROM Cars
	ORDER BY id
	OFFSET (@Page -1) * @Size ROWS
	FETCH NEXT @Size ROWS ONLY
END

ऊपर की स्क्रिप्ट में हम एक संग्रहित प्रक्रिया बनाते हैं spGetRecordsByPageAndSize जो 2 पैरामीटर @Page और @Size लेता है। संग्रहीत कार्यविधि कई पृष्ठों और पृष्ठ आकार द्वारा रिकॉर्ड्स को फ़िल्टर करने के लिए OFFSET FETCH NEXT का उपयोग करती है। उदाहरण के लिए, यदि पृष्ठ संख्या 2 है, और आकार 20 है, तो OFFSET होगा:

(2 – 1) * 20 =20

और FETCH के लिए अगला मान @Size यानी 20 के बराबर होगा। इसलिए आईडी 21 से 40 वाले रिकॉर्ड वापस कर दिए जाएंगे। संग्रहीत कार्यविधि बनाने के लिए उपरोक्त स्क्रिप्ट निष्पादित करें।
एक बार जब आप संग्रहीत कार्यविधि बना लेते हैं, तो निम्न स्क्रिप्ट निष्पादित करके देखें कि पृष्ठ संख्या 2 और पृष्ठ का आकार 20 होने पर क्या लौटाया जाता है।

EXECUTE spGetRecordsByPageAndSize 2, 20

उपरोक्त स्क्रिप्ट का आउटपुट इस तरह दिखता है:

इसी तरह, यदि आप प्रति पृष्ठ 15 रिकॉर्ड के साथ चौथे पृष्ठ के रिकॉर्ड पुनर्प्राप्त करना चाहते हैं, तो निम्न क्वेरी आईडी 46 से आईडी 60 तक के रिकॉर्ड पुनर्प्राप्त करती है।

EXECUTE spGetRecordsByPageAndSize 4, 15

का आउटपुट इस तरह दिखता है:

निष्कर्ष

OFFSET FETCH NEXT एक अत्यंत उपयोगी उपकरण है, खासकर यदि आप बड़ी संख्या में रिकॉर्ड को पृष्ठों में समूहीकृत करना चाहते हैं। इस लेख में, हमने देखा कि फ्रंट-एंड एप्लिकेशन पर पेजिंग को लागू करने के लिए संग्रहीत प्रक्रिया के संयोजन में इसका उपयोग कैसे किया जाता है।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. फ़ंक्शन का उपयोग करके दो तिथियों के बीच तिथियों की सूची प्राप्त करें

  2. बल्क इंसर्ट निश्चित चौड़ाई वाले क्षेत्र

  3. SQL सर्वर के टाइमस्टैम्प कॉलम को डेटाटाइम फॉर्मेट में कैसे बदलें

  4. परिणाम के रूप में पूर्ण दिनांक-समय मान के साथ SQL सर्वर में प्रति घंटे पंक्तियों की गणना करें

  5. क्या EXISTS को सीधे बिट के रूप में चुनना संभव है?