यह आलेख SQL कर्सर का वर्णन करता है और कुछ विशेष उद्देश्यों के लिए उनका उपयोग कैसे करें। यह SQL कर्सर के साथ-साथ उनके डाउनसाइड्स के महत्व पर प्रकाश डालता है।
ऐसा हमेशा नहीं होता है कि आप डेटाबेस प्रोग्रामिंग में SQL कर्सर का उपयोग करते हैं, लेकिन उनकी वैचारिक समझ और उनका उपयोग करना सीखने से यह समझने में बहुत मदद मिलती है कि T-SQL प्रोग्रामिंग में असाधारण कार्यों को कैसे किया जाए।
SQL कर्सर अवलोकन
यदि आप SQL कर्सर से परिचित नहीं हैं, तो आइए हम SQL कर्सर की कुछ बुनियादी बातों पर ध्यान दें।
सरल परिभाषा
SQL कर्सर एक समय में एक पंक्ति में डेटा तक पहुंच प्रदान करता है जिससे आपको परिणाम सेट पर अधिक (पंक्ति-दर-पंक्ति) नियंत्रण मिलता है।
माइक्रोसॉफ्ट परिभाषा
Microsoft दस्तावेज़ीकरण के अनुसार, Microsoft SQL सर्वर स्टेटमेंट एक पूर्ण परिणाम सेट उत्पन्न करते हैं, लेकिन कई बार परिणाम एक समय में एक पंक्ति में सबसे अच्छे तरीके से संसाधित होते हैं। परिणाम सेट पर कर्सर खोलने से परिणाम सेट को एक बार में एक पंक्ति में संसाधित करने की अनुमति मिलती है।
T-SQL और परिणाम सेट
चूँकि SQL कर्सर की सरल और Microsoft दोनों परिभाषाएँ एक परिणाम सेट का उल्लेख करती हैं, आइए हम यह समझने की कोशिश करें कि डेटाबेस प्रोग्रामिंग के संदर्भ में परिणाम सेट वास्तव में क्या है। आइए हम एक नमूना डेटाबेस UniversityV3 में छात्र तालिका को शीघ्रता से बनाएं और पॉप्युलेट करें:
टेबल बनाएं [डीबीओ]। [छात्र] ( [छात्र आईडी] इंट पहचान (1, 1) न्यूल नहीं, [नाम] वर्चर (30) न्यूल, [कोर्स] वर्चर (30) न्यूल, [मार्क्स] इंट न्यूल, [परीक्षा दिनांक] DATETIME2 (7) NULL, CONSTRAINT [PK_Student] प्राथमिक कुंजी क्लस्टर ([StudentId] ASC));-- (5) छात्र तालिका SET IDENTITY_INSERT [dbo]। [छात्र] को [dbo] में डालें। [छात्र] ( [StudentId], [Name], [Course], [Marks], [ExamDate]) Values (1, N'Asif', N'Database Management System', 80, N'2016-01-01 00:00:00 ') INSERT INTO [dbo]। [Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (2, N'Peter', N'Database Management System', 85, N'2016-01-01 00:00:00') INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) Values (3, N') सैम', एन'डाटाबेस मैनेजमेंट सिस्टम', 85, एन'2016-01-01 00:00:00') INSERT INTO [dbo]।[Student] ([StudentId], [Name], [Course], [Marks ], [परीक्षा दिनांक]) मान (4, एन'आदिल', एन'डेटाबेस प्रबंधन प्रणाली', 85, एन'2016-01-01 00:00:00 ') INSERT INTO [dbo]। [Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (5, N'Naveed', N'Database Management System', 90, N'2016-01-01 00:00:00')सेट IDENTITY_INSERT [dbo].[Student] OFF
अब, विद्यार्थी . से सभी पंक्तियों का चयन करें तालिका:
-- छात्र तालिका डेटा देखें [StudentId], [Name], [Course], [Marks], [ExamDate] FROM dbo.Student
यह परिणाम सेट है जो विद्यार्थी . से सभी रिकॉर्ड चुनने के परिणामस्वरूप लौटाया जाता है टेबल।
T-SQL और सेट थ्योरी
T-SQL विशुद्ध रूप से निम्नलिखित दो गणितीय अवधारणाओं पर आधारित है:
- सिद्धांत सेट करें
- तर्क की भविष्यवाणी करें
सेट सिद्धांत, जैसा कि नाम से संकेत मिलता है, सेट के बारे में गणित की एक शाखा है जिसे निश्चित विशिष्ट वस्तुओं का संग्रह भी कहा जा सकता है।
संक्षेप में, सेट थ्योरी में, हम चीजों या वस्तुओं के बारे में उसी तरह सोचते हैं जैसे हम एक व्यक्तिगत वस्तु के बारे में सोचते हैं।
उदाहरण के लिए, छात्र सभी निश्चित विशिष्ट छात्रों का एक समूह है, इसलिए, हम एक छात्र को समग्र रूप से लेते हैं जो उस सेट (तालिका) में सभी छात्रों का विवरण प्राप्त करने के लिए पर्याप्त है।
अधिक जानकारी के लिए कृपया मेरा लेख द आर्ट ऑफ़ एग्रीगेटिंग डेटा इन एसक्यूएल देखें।
कर्सर और पंक्ति-आधारित संचालन
T-SQL को मुख्य रूप से सेट आधारित संचालन करने के लिए डिज़ाइन किया गया है जैसे किसी तालिका से सभी रिकॉर्ड का चयन करना या किसी तालिका से सभी पंक्तियों को हटाना।
संक्षेप में, टी-एसक्यूएल को विशेष रूप से एक सेट आधारित फैशन में टेबल के साथ काम करने के लिए डिज़ाइन किया गया है, जिसका अर्थ है कि हम एक टेबल के बारे में सोचते हैं, और कोई भी ऑपरेशन जैसे चयन, अपडेट या डिलीट को पूरी तरह से टेबल या निश्चित रूप से लागू किया जाता है। पंक्तियाँ जो मानदंडों को पूरा करती हैं।
हालांकि, ऐसे मामले हैं जब टेबल को एक ही परिणाम सेट के बजाय पंक्ति दर पंक्ति एक्सेस करने की आवश्यकता होती है, और यह तब होता है जब कर्सर कार्रवाई में आते हैं।
वैदेही पांडेरे के अनुसार, कभी-कभी एप्लिकेशन लॉजिक को सभी पंक्तियों के बजाय एक समय में एक पंक्ति के साथ काम करने की आवश्यकता होती है जो पूरे परिणाम सेट के माध्यम से लूपिंग (लूप का पुनरावृति का उपयोग) के समान है।
उदाहरण के साथ SQL कर्सर की मूल बातें
आइए अब SQL कर्सर के बारे में अधिक चर्चा करें।
सबसे पहले, आइए जानें या समीक्षा करें (जो पहले से ही टी-एसक्यूएल में कर्सर का उपयोग करने से परिचित हैं) टी-एसक्यूएल में कर्सर का उपयोग कैसे करें।
SQL कर्सर का उपयोग करना एक पाँच-चरणीय प्रक्रिया है जिसे इस प्रकार व्यक्त किया जाता है:
- कर्सर घोषित करें
- कर्सर खोलें
- पंक्तियां प्राप्त करें
- कर्सर बंद करें
- Deallocate Cursor
चरण 1:कर्सर घोषित करें
पहला कदम SQL कर्सर घोषित करना है ताकि बाद में इसका उपयोग किया जा सके।
SQL कर्सर को इस प्रकार घोषित किया जा सकता है:
डिक्लेयर कर्सर <कर्सर_नाम> <एसक्यूएल स्टेटमेंट> के लिए
चरण 2:कर्सर खोलें
घोषणा के बाद अगला कदम कर्सर को खोलना है जिसका अर्थ है कर्सर को परिणाम सेट के साथ पॉप्युलेट करना जो इस प्रकार व्यक्त किया गया है:
खोलें
चरण 3:पंक्तियाँ प्राप्त करें
एक बार जब कर्सर घोषित और खोला जाता है, तो अगला कदम SQL कर्सर से पंक्तियों को एक-एक करके पुनर्प्राप्त करना शुरू करना है ताकि पंक्तियों को SQL कर्सर से अगली उपलब्ध पंक्ति प्राप्त हो:
अगला. से प्राप्त करें
चरण 4:कर्सर बंद करें
एक बार पंक्तियों को एक-एक करके लाया जाता है और आवश्यकता के अनुसार हेरफेर किया जाता है, अगला कदम SQL कर्सर को बंद करना है।
SQL कर्सर को बंद करने से तीन कार्य होते हैं:
- वर्तमान में कर्सर द्वारा रखे गए परिणाम सेट को जारी करता है
- कर्सर द्वारा पंक्तियों पर किसी भी कर्सर लॉक को मुक्त करता है
- खुले कर्सर को बंद करता है
कर्सर को बंद करने का सरल सिंटैक्स इस प्रकार है:
बंद करें
चरण 5:कर्सर हटाएं
इस संबंध में अंतिम चरण कर्सर को हटाना है जो कर्सर संदर्भ को हटा देता है।
वाक्य रचना इस प्रकार है:
DEALLOCATE
SQL कर्सर संगतता
Microsoft दस्तावेज़ के अनुसार, SQL कर्सर निम्न संस्करणों के साथ संगत हैं:
- एसक्यूएल सर्वर 2008 और ऊपर के संस्करण
- Azure SQL डेटाबेस
SQL कर्सर उदाहरण 1:
अब जब हम SQL कर्सर को लागू करने के चरणों से परिचित हो गए हैं, तो आइए SQL कर्सर का उपयोग करने का एक सरल उदाहरण देखें:
-- छात्र कर्सर उदाहरण घोषित करें 1USE UniversityV3GODECLARE Student_Cursor CURSOR चयनित छात्र आईडी के लिए, [नाम] dbo से।आउटपुट इस प्रकार है:
SQL कर्सर उदाहरण 2:
इस उदाहरण में, हम कर्सर द्वारा रखे गए डेटा को स्टोर करने के लिए दो वेरिएबल्स का उपयोग करने जा रहे हैं क्योंकि यह एक पंक्ति से दूसरी पंक्ति में जाता है ताकि हम वेरिएबल मानों को प्रदर्शित करके एक समय में परिणाम सेट एक पंक्ति प्रदर्शित कर सकें।
- छात्र कर्सर को चर के साथ घोषित करें 2USE UniversityV3GODECLARE @StudentId INT,@StudentName VARCHAR(40) - कर्सर द्वारा रखे गए पंक्ति डेटा को होल्ड करने के लिए वेरिएबल घोषित करें, छात्र का चयन करें के लिए छात्र_कर्सर कर्सर का चयन करें, [नाम] से dbo.Student;OPEN Student_Curs छात्र_कर्सर से आगे @StudentId, @StudentName -- पहली पंक्ति प्राप्त करें और इसे वेरिएबल में स्टोर करेंWHILE @@FETCH_STATUS =0BEGINPRINT CONCAT(@StudentId,'--', @StudentName) -- वेरिएबल डेटा दिखाएं छात्र_कर्सर से अगला प्राप्त करें -- अगली पंक्ति प्राप्त करें डेटा को कर्सर में डालें और इसे वैरिएबल में स्टोर करेंINTO@StudentId, @StudentNameENDCLOSE Student_Cursor -- पंक्तियों पर कर्सर लॉक बंद करेंDEALLOCATE Student_Cursor -- कर्सर संदर्भ छोड़ेंउपरोक्त SQL कोड का परिणाम इस प्रकार है:
कोई यह तर्क देगा कि हम निम्नानुसार सरल SQL स्क्रिप्ट का उपयोग करके समान आउटपुट प्राप्त कर सकते हैं:
-- बिना SQL कर्सर के छात्र आईडी और नाम देखना
वास्तव में, ऐसे कुछ कार्य हैं जिनके लिए SQL कर्सर का उपयोग करने की आवश्यकता होती है, इस तथ्य के बावजूद कि स्मृति पर उनके प्रत्यक्ष प्रभाव के कारण SQL कर्सर का उपयोग करने के लिए इसे हतोत्साहित किया जाता है।
महत्वपूर्ण नोट
कृपया ध्यान रखें कि वैदेही पांडेरे के अनुसार, कर्सर पॉइंटर्स का एक मेमोरी रेजिडेंट सेट होता है, इसलिए वे आपकी सिस्टम मेमोरी पर कब्जा कर लेते हैं जो अन्यथा अन्य महत्वपूर्ण प्रक्रियाओं द्वारा उपयोग किया जाएगा; यही कारण है कि कर्सर के माध्यम से सेट किए गए बड़े परिणाम को पार करना कभी भी एक अच्छा विचार नहीं है जब तक कि उसके लिए कोई वैध कारण न हो।
विशेष प्रयोजनों के लिए SQL कर्सर का उपयोग करना
हम कुछ विशेष उद्देश्यों के बारे में जानेंगे जिनके लिए SQL कर्सर का उपयोग किया जा सकता है।
डेटाबेस सर्वर मेमोरी परीक्षण
चूंकि SQL कर्सर का सिस्टम मेमोरी पर बहुत अधिक प्रभाव पड़ता है, इसलिए वे उन परिदृश्यों को दोहराने के लिए अच्छे उम्मीदवार हैं जहां विभिन्न संग्रहीत प्रक्रियाओं या तदर्थ SQL स्क्रिप्ट द्वारा अत्यधिक मेमोरी उपयोग की जांच की जानी चाहिए।
इसे समझने का एक आसान तरीका यह है कि SSMS (SQL सर्वर मैनेजमेंट स्टूडियो) में टूलबार पर क्लाइंट सांख्यिकी बटन पर क्लिक करें (या Shift+Alt+S दबाएं) और कर्सर के बिना एक साधारण क्वेरी चलाएँ:
अब वेरिएबल का उपयोग करके कर्सर के साथ क्वेरी चलाएँ (SQL Cursor उदाहरण 2):
अब कृपया अंतर नोट करें:
कर्सर के बिना सेलेक्ट स्टेटमेंट की संख्या:1
कर्सर के साथ चयनित कथनों की संख्या:7
कर्सर के बिना सर्वर राउंडट्रिप की संख्या:1
कर्सर के साथ सर्वर राउंडट्रिप की संख्या:2
कर्सर के बिना क्लाइंट संसाधन समय:1
कर्सर के साथ क्लाइंट संसाधन समय:8
कर्सर के बिना कुल निष्पादन समय:1
कर्सर के साथ कुल निष्पादन समय:38
सर्वर पर प्रतीक्षा समय कर्सर के बिना उत्तर देता है:0
सर्वर पर प्रतीक्षा समय कर्सर के साथ उत्तर देता है:30
संक्षेप में, कर्सर के बिना क्वेरी चलाना जो केवल 5 पंक्तियों को लौटाता है, उसी क्वेरी को कर्सर के साथ 6-7 बार चला रहा है।
अब आप कल्पना कर सकते हैं कि कर्सर का उपयोग करके स्मृति प्रभाव को दोहराना कितना आसान है, हालांकि, यह हमेशा सबसे अच्छी बात नहीं है।
बल्क डेटाबेस ऑब्जेक्ट मैनिपुलेशन टास्क
एक और क्षेत्र है जहां SQL कर्सर काम में आ सकते हैं और यह तब होता है जब हमें डेटाबेस या डेटाबेस ऑब्जेक्ट्स पर एक बल्क ऑपरेशन करना होता है।
इसे समझने के लिए, पहले हमें पाठ्यक्रम तालिका बनानी होगी और इसे UniversityV3 में भरना होगा। डेटाबेस इस प्रकार है:
-- कोर्स टेबल बनाएं टेबल बनाएं [dbo]। [PK_Course] प्राथमिक कुंजी क्लस्टर ([CourseId] ASC));-- कोर्स टेबल सेट करें IDENTITY_INSERT [dbo]। [कोर्स] ONINSERT INTO [dbo]। (1, N'DevOps for Databases', N'This is about DevOps for Database') INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (2, N'Power BI) Fundamentals', N'This is about Power BI Fundamentals')INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (3, N'T-SQL Programming', N'About) T-SQL प्रोग्रामिंग') INSERT INTO [dbo]। INTO [dbo]। [कोर्स] ([CourseId], [Name], [Detail]) VALUES (5, N'Analysis Services Fundamentals', N'This is about Analysis Services Fundamentals')SET IDENTITY_INSERT [डीबीओ]।[पाठ्यक्रम] बंदअब मान लीजिए कि हम UniversityV3 . में सभी मौजूदा तालिकाओं का नाम बदलना चाहते हैं डेटाबेस पुराने टेबल के रूप में।
इसके लिए सभी तालिकाओं पर एक-एक करके कर्सर पुनरावृत्ति की आवश्यकता होती है ताकि उनका नाम बदला जा सके।
निम्नलिखित कोड काम करता है:
-- सभी टेबल का नाम बदलने के लिए स्टूडेंट कर्सर घोषित करें। T; छात्र_कर्सर से अगला छात्र_कर्सर फ़ेच करें @TableNameWHILE @@FETCH_STATUS =0BEGINSET @[email protected]+'_OLD' -- तालिका के एक्ससिटिंग नाम में _OLD जोड़ें EXEC sp_rename @TableName,@NewTableName --Curs अगली तालिका का नाम OLD तालिका के रूप में बदलें -- कर्सर में अगली पंक्ति का डेटा प्राप्त करें और इसे वैरिएबल में स्टोर करेंINTO @TableNameENDCLOSE Student_Cursor -- पंक्तियों पर कर्सर लॉक बंद करेंDEALLOCATE Student_Cursor -- कर्सर संदर्भ छोड़ें
बधाई हो, आपने SQL कर्सर का उपयोग करके सभी मौजूदा तालिकाओं का सफलतापूर्वक नाम बदल दिया है।
करने योग्य चीज़ें
अब जब आप SQL कर्सर के उपयोग से परिचित हो गए हैं, तो कृपया निम्न चीज़ें आज़माएँ:
- कृपया कर्सर के माध्यम से एक नमूना डेटाबेस की सभी तालिकाओं की अनुक्रमणिका बनाने और उनका नाम बदलने का प्रयास करें।
- कृपया इस आलेख में बदली गई तालिकाओं को कर्सर का उपयोग करके मूल नामों पर वापस लाने का प्रयास करें।
- कृपया बहुत सी पंक्तियों के साथ तालिकाओं को पॉप्युलेट करने का प्रयास करें और कर्सर के साथ और बिना प्रश्नों के आंकड़ों और समय को मापें।