इस लेख में, हम SQL कर्सर का उपयोग करने के कुछ विकल्पों को देखेंगे जो कर्सर के उपयोग से होने वाली प्रदर्शन समस्याओं से बचने में मदद कर सकते हैं।
विकल्पों पर चर्चा करने से पहले, आइए SQL कर्सर की सामान्य अवधारणा की समीक्षा करें।
SQL कर्सर का त्वरित अवलोकन
एसक्यूएल कर्सर मुख्य रूप से उपयोग किए जाते हैं जहां सेट-आधारित संचालन लागू नहीं होते हैं और आपको डेटा तक पहुंचने और एक बार में एक ही सेट-आधारित ऑपरेशन को एक संपूर्ण ऑब्जेक्ट (जैसे एक टेबल या एक सेट) पर लागू करने के बजाय एक पंक्ति में संचालन करने की आवश्यकता होती है। टेबल)।
सरल परिभाषा
SQL कर्सर एक समय में एक पंक्ति में डेटा तक पहुंच प्रदान करता है, जिससे आपको परिणाम सेट पर सीधे पंक्ति-दर-पंक्ति नियंत्रण मिलता है।
माइक्रोसॉफ्ट परिभाषा
Microsoft दस्तावेज़ के अनुसार, Microsoft SQL सर्वर स्टेटमेंट एक पूर्ण परिणाम सेट का उत्पादन करते हैं, लेकिन कई बार ऐसा होता है कि इसे एक समय में एक पंक्ति में संसाधित करना सबसे अच्छा होता है - जो कि परिणाम सेट पर एक कर्सर खोलकर किया जा सकता है।
कर्सर का उपयोग करने की 5-चरणीय प्रक्रिया
SQL कर्सर का उपयोग करने की प्रक्रिया को आम तौर पर निम्नानुसार वर्णित किया जा सकता है:
- कर्सर घोषित करें
- कर्सर खोलें
- पंक्तियां प्राप्त करें
- कर्सर बंद करें
- Deallocate Cursor
महत्वपूर्ण नोट
कृपया ध्यान रखें कि, वैदेही पांडेरे के अनुसार, कर्सर पॉइंटर्स होते हैं जो आपकी सिस्टम मेमोरी पर कब्जा कर लेते हैं - जो अन्यथा अन्य महत्वपूर्ण प्रक्रियाओं के लिए आरक्षित होंगे। इसलिए कर्सर का उपयोग करके सेट किए गए बड़े परिणाम को ट्रेस करना आमतौर पर सबसे अच्छा विचार नहीं है - जब तक कि ऐसा करने का कोई वैध कारण न हो।
इस बारे में अधिक विस्तृत जानकारी के लिए, बेझिझक मेरे लेख को देखें कि विशेष उद्देश्यों के लिए SQL कर्सर का उपयोग कैसे करें।
SQL कर्सर उदाहरण
सबसे पहले, हम एक उदाहरण देखेंगे कि कैसे एक SQL कर्सर का उपयोग एक-एक करके डेटाबेस ऑब्जेक्ट का नाम बदलने के लिए किया जा सकता है।
एक SQL कर्सर बनाने के लिए जिसकी हमें आवश्यकता है, आइए एक नमूना डेटाबेस सेटअप करें ताकि हम इसके विरुद्ध अपनी स्क्रिप्ट चला सकें।
सेटअप सैंपल डेटाबेस (UniversityV3)
दो तालिकाओं के साथ UniversityV3 नमूना डेटाबेस बनाने और पॉप्युलेट करने के लिए निम्न स्क्रिप्ट चलाएँ:
-- (1) Create UniversityV3 sample database CREATE DATABASE UniversityV3; GO USE UniversityV3 -- (2) Create Course table IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES T WHERE T.TABLE_NAME='Course') DROP TABLE dbo.Course CREATE TABLE [dbo].[Course] ( [CourseId] INT IDENTITY (1, 1) NOT NULL, [Name] VARCHAR (30) NOT NULL, [Detail] VARCHAR (200) NULL, CONSTRAINT [PK_Course] PRIMARY KEY CLUSTERED ([CourseId] ASC) ); -- (3) Create Student table IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES T WHERE T.TABLE_NAME='Student') DROP TABLE dbo.Student CREATE TABLE [dbo].[Student] ( [StudentId] INT IDENTITY (1, 1) NOT NULL, [Name] VARCHAR (30) NULL, [Course] VARCHAR (30) NULL, [Marks] INT NULL, [ExamDate] DATETIME2 (7) NULL, CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED ([StudentId] ASC) ); -- (4) Populate Course table SET IDENTITY_INSERT [dbo].[Course] ON INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (1, N'DevOps for Databases', N'This is about DevOps for Databases') 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 Programming') INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (4, N'Tabular Data Modeling', N'This is about Tabular Data Modeling') INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (5, N'Analysis Services Fundamentals', N'This is about Analysis Services Fundamentals') SET IDENTITY_INSERT [dbo].[Course] OFF -- (5) Populate Student table SET IDENTITY_INSERT [dbo].[Student] ON INSERT INTO [dbo].[Student] ([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'Sam', N'Database Management System', 85, N'2016-01-01 00:00:00') INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (4, N'Adil', N'Database Management System', 85, N'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') SET IDENTITY_INSERT [dbo].[Student] OFF
तालिकाओं का नाम बदलने के लिए एक SQL कर्सर बनाएं (_बैकअप)
अब कर्सर का उपयोग करके निम्नलिखित विनिर्देशों को पूरा करने पर विचार करें:
- हमें डेटाबेस में सभी मौजूदा तालिकाओं के नामों में '_बैकअप' जोड़ने की आवश्यकता है
- टेबल्स जिनके नाम में पहले से ही '_बैकअप' है, उनका नाम नहीं बदला जाना चाहिए
आइए प्रत्येक तालिका के नाम में '_बैकअप' जोड़कर नमूना डेटाबेस में सभी तालिकाओं का नाम बदलने के लिए एक SQL कर्सर बनाएं, साथ ही यह भी सुनिश्चित करें कि उनके नाम में '_बैकअप' वाली तालिकाएं निम्नलिखित कोड को चलाकर दोबारा नहीं बदली जाएंगी:
-- Declaring the Student cursor to rename all tables by adding ‘_backup’ to their names and also making sure that all tables that are already named correctly will be skipped: USE UniversityV3 GO DECLARE @TableName VARCHAR(50) -- Existing table name ,@NewTableName VARCHAR(50) -- New table name DECLARE Student_Cursor CURSOR FOR SELECT T.TABLE_NAME FROM INFORMATION_SCHEMA.TABLES T; OPEN Student_Cursor FETCH NEXT FROM Student_Cursor INTO @TableName WHILE @@FETCH_STATUS = 0 BEGIN IF RIGHT(@TableName,6)<>'Backup' -- If Backup table does not exist then rename the table BEGIN SET @[email protected]+'_Backup' -- Add _Backup to the table’s current name EXEC sp_rename @TableName,@NewTableName -- Rename table as OLD table END ELSE PRINT 'Backup table name already exists: '[email protected] FETCH NEXT FROM Student_Cursor -- Get next row data into cursor and store it in variables INTO @TableName END CLOSE Student_Cursor -- Close cursor locks on the rows DEALLOCATE Student_Cursor -- Release cursor reference
नामकरण स्क्रिप्ट चलाएँ और परिणाम देखें
अब, स्क्रिप्ट चलाने और परिणाम देखने के लिए SSMS (SQL सर्वर प्रबंधन स्टूडियो) में F5 दबाएं:
SSMS ऑब्जेक्ट एक्सप्लोरर में तालिकाओं के नामों को ताज़ा करने से स्पष्ट रूप से पता चलता है कि हमने उन्हें निर्दिष्ट रूप से सफलतापूर्वक बदल दिया है।
आइए फिर से F5 दबाकर स्क्रिप्ट को फिर से चलाएं और परिणाम देखें:
बैकअप नामकरण रीसेट करने के लिए SQL कर्सर बनाना
हमें एक स्क्रिप्ट बनाने की भी आवश्यकता है जो SQL कर्सर का उपयोग उन तालिकाओं के नामों को वापस करने के लिए करती है जिन्हें हमने अभी-अभी शुरुआती वाले में बदला है - हम उनके नामों से '_बैकअप' को हटाकर ऐसा करेंगे।
नीचे दी गई स्क्रिप्ट हमें बस यही करने देगी:
-- Declare the Student cursor to reset tables names _backup to their original forms by removing ‘_backup’ USE UniversityV3 GO DECLARE @TableName VARCHAR(50) -- Existing table name ,@NewTableName VARCHAR(50) -- New table name DECLARE Student_Cursor CURSOR FOR SELECT T.TABLE_NAME FROM INFORMATION_SCHEMA.TABLES T; OPEN Student_Cursor FETCH NEXT FROM Student_Cursor INTO @TableName WHILE @@FETCH_STATUS = 0 BEGIN IF RIGHT(@TableName,6)='Backup' -- If Backup table name exists then reset (rename) it BEGIN SET @NewTableName=SUBSTRING(@TableName,1,LEN(@TableName)-7) -- Remove _Backup from the table name EXEC sp_rename @TableName,@NewTableName -- Rename table END ELSE PRINT 'Backup table name already reset: '[email protected] FETCH NEXT FROM Student_Cursor – Get the data of the next row into cursor and store it in variables INTO @TableName END CLOSE Student_Cursor -- Close cursor locks on the rows DEALLOCATE Student_Cursor -- Release cursor reference
रीसेट स्क्रिप्ट चलाएँ और परिणाम देखें
स्क्रिप्ट चलाने से पता चलता है कि तालिका के नाम सफलतापूर्वक रीसेट कर दिए गए हैं:
ये कुछ परिदृश्यों के उदाहरण थे जिनमें आवश्यकता की प्रकृति के कारण SQL कर्सर का उपयोग करने से बचना मुश्किल है। हालांकि, एक वैकल्पिक दृष्टिकोण खोजना अभी भी संभव है।
SQL कर्सर विकल्प
SQL कर्सर के लिए दो सबसे आम विकल्प हैं, तो आइए उनमें से प्रत्येक को विस्तार से देखें।
वैकल्पिक 1:तालिका चर
इनमें से एक विकल्प तालिका चर हैं।
टेबल वेरिएबल, टेबल की तरह, कई परिणाम स्टोर कर सकते हैं - लेकिन कुछ सीमाओं के साथ। Microsoft दस्तावेज़ के अनुसार, तालिका चर एक विशेष डेटा प्रकार है जिसका उपयोग बाद में प्रसंस्करण के लिए परिणाम सेट को संग्रहीत करने के लिए किया जाता है।
हालांकि, ध्यान रखें कि छोटे डेटा सेट के साथ तालिका चर का सबसे अच्छा उपयोग किया जाता है।
छोटे पैमाने के प्रश्नों के लिए तालिका चर बहुत कुशल हो सकते हैं क्योंकि वे स्थानीय चर की तरह काम करते हैं और दायरे से बाहर होने पर स्वचालित रूप से साफ हो जाते हैं।
टेबल वैरिएबल स्ट्रैटेजी:
हम इन चरणों का पालन करके डेटाबेस से सभी तालिकाओं का नाम बदलने के लिए SQL कर्सर के बजाय तालिका चर का उपयोग करेंगे:
- टेबल वैरिएबल घोषित करें
- टेबल के नाम और आईडी को हमारे द्वारा घोषित टेबल वेरिएबल में स्टोर करें
- काउंटर को 1 पर सेट करें और तालिका चर से रिकॉर्ड की कुल संख्या प्राप्त करें
- जब तक काउंटर रिकॉर्ड की कुल संख्या से कम या उसके बराबर है, तब तक 'जबकि' लूप का उपयोग करें
- 'जबकि' लूप के अंदर, हम एक-एक करके तालिकाओं का नाम बदल देंगे, जब तक कि उनका पहले से नाम नहीं बदला जाता है और प्रत्येक तालिका के लिए काउंटर को बढ़ाया जाता है
टेबल वेरिएबल कोड:
निम्न SQL स्क्रिप्ट चलाएँ जो तालिकाओं का नाम बदलने के लिए तालिका चर बनाता और उपयोग करता है:
-- Declare Student Table Variable to rename all tables by adding ‘_backup’ t their name and also making sure that already renamed tables are skipped USE UniversityV3 GO DECLARE @TableName VARCHAR(50) -- Existing table name ,@NewTableName VARCHAR(50) -- New table name DECLARE @StudentTableVar TABLE -- Declaring a table variable to store tables names ( TableId INT, TableName VARCHAR(40)) INSERT INTO @StudentTableVar -- insert tables names into the table variable SELECT ROW_NUMBER() OVER(ORDER BY T.TABLE_NAME),T.TABLE_NAME FROM INFORMATION_SCHEMA.TABLES T DECLARE @TotalRows INT=(SELECT COUNT(*) FROM @StudentTableVar),@i INT=1 -- Get total rows and set counter to 1 WHILE @i<[email protected] -- begin as long as i (counter) is less than or equal to the total number of records BEGIN -- ‘While’ loop begins here SELECT @TableName=TableName from @StudentTableVar WHERE [email protected] IF RIGHT(@TableName,6)<>'Backup' -- If a Backup table does not exist, then rename the table BEGIN SET @[email protected]+'_Backup' -- Add _Backup to the table’s current name EXEC sp_rename @TableName,@NewTableName -- Rename the table as OLD table END ELSE PRINT 'Backup table name already exists: '[email protected] SET @[email protected]+1 END -- 'While' loop ends here
स्क्रिप्ट चलाएँ और परिणाम देखें
अब, स्क्रिप्ट को निष्पादित करते हैं और परिणामों की जांच करते हैं:
वैकल्पिक 2:अस्थायी तालिकाएं
परिणाम सेट एक बार में एक पंक्ति को पुनरावृत्त करने के लिए हम SQL कर्सर के बजाय अस्थायी तालिकाओं का भी उपयोग कर सकते हैं।
अस्थायी तालिकाएं लंबे समय से उपयोग में हैं और बड़े डेटा सेट के लिए कर्सर को बदलने का एक शानदार तरीका प्रदान करती हैं।
तालिका चर की तरह, अस्थायी तालिकाएँ परिणाम सेट को पकड़ सकती हैं ताकि हम इसे 'जबकि' लूप जैसे पुनरावृत्त एल्गोरिथम के साथ संसाधित करके आवश्यक संचालन कर सकें।
अस्थायी तालिका रणनीति:
हम इन चरणों का पालन करके नमूना डेटाबेस में सभी तालिकाओं का नाम बदलने के लिए एक अस्थायी तालिका का उपयोग करेंगे:
- एक अस्थायी तालिका घोषित करें
- टेबल के नाम और आईडी को हमारे द्वारा घोषित अस्थायी टेबल में स्टोर करें
- काउंटर को 1 पर सेट करें और अस्थायी तालिका से रिकॉर्ड की कुल संख्या प्राप्त करें
- जब तक काउंटर रिकॉर्ड की कुल संख्या से कम या उसके बराबर है, तब तक 'जबकि' लूप का उपयोग करें
- 'जबकि' लूप के भीतर, एक-एक करके तालिकाओं का नाम बदलें, जब तक कि उनका पहले से नाम नहीं बदला गया हो और प्रत्येक तालिका के लिए काउंटर बढ़ा दें
टेबल रीसेट करें
हमें तालिकाओं के नामों को उनके नामों के अंत से '_बैकअप' हटाकर उनके प्रारंभिक रूप में रीसेट करने की आवश्यकता है, इसलिए कृपया उस रीसेट स्क्रिप्ट को फिर से चलाएँ जो हम पहले ही लिख चुके हैं और ऊपर उपयोग कर चुके हैं ताकि हम तालिकाओं का नाम बदलने की एक और विधि लागू कर सकें।पी>
अस्थायी तालिका कोड:
हमारे डेटाबेस में सभी तालिकाओं का नाम बदलने के लिए एक अस्थायी तालिका बनाने और उपयोग करने के लिए निम्न SQL स्क्रिप्ट चलाएँ:
-- Declare the Student Temporary Table to rename all tables by adding ‘_backup’ to their names while also making sure that already renamed tables are skipped USE UniversityV3 GO DECLARE @TableName VARCHAR(50) -- Existing table name ,@NewTableName VARCHAR(50) -- New table name CREATE TABLE #Student -- Declaring a temporary table ( TableId INT, TableName VARCHAR(40) ) INSERT INTO #Student -- insert tables names into the temporary table SELECT ROW_NUMBER() OVER(ORDER BY T.TABLE_NAME),T.TABLE_NAME FROM INFORMATION_SCHEMA.TABLES T DECLARE @TotalRows INT=(SELECT COUNT(*) FROM #Student),@i INT=1 -- Get the total amount of rows and set the counter to 1 WHILE @i<[email protected] -- begin as long as i (counter) is less than or equal to the total number of records BEGIN -- ‘While’ loop begins here SELECT @TableName=TableName from #Student WHERE [email protected] IF RIGHT(@TableName,6)<>'Backup' -- If a Backup table does not exist, then rename the table BEGIN SET @[email protected]+'_Backup' -- Add ‘_Backup’ to the table’s current name EXEC sp_rename @TableName,@NewTableName -- Rename the table as OLD table END ELSE PRINT 'Backup table name already exists: '[email protected] SET @[email protected]+1 END -- While loop ends here DROP TABLE #Student
स्क्रिप्ट चलाएँ और आउटपुट जाँचें
अब, परिणाम देखने के लिए स्क्रिप्ट निष्पादित करें:
करने के लिए चीज़ें
अब जब आप SQL कर्सर के विकल्पों से परिचित हैं - जैसे तालिका चर और अस्थायी तालिकाओं का उपयोग करना - कृपया इस ज्ञान को व्यवहार में लागू करने में सहज महसूस करने के लिए निम्नलिखित चीजें करने का प्रयास करें:
- एक नमूना डेटाबेस में सभी तालिकाओं के सूचकांक बनाएं और उनका नाम बदलें - पहले एक कर्सर के माध्यम से, और फिर वैकल्पिक विधियों (तालिका चर और अस्थायी तालिकाओं) का उपयोग करके
- वैकल्पिक विधियों (अस्थायी तालिकाओं और तालिका चर) का उपयोग करके इस आलेख से तालिकाओं के नामों को उनके प्रारंभिक नामों पर वापस लाएं
- आप मेरे लेख में पहले उदाहरण (उदाहरणों) का भी उल्लेख कर सकते हैं कि विशेष उद्देश्यों के लिए SQL कर्सर का उपयोग कैसे करें और बहुत सारी पंक्तियों के साथ तालिकाओं को पॉप्युलेट करने का प्रयास करें और विकल्पों के साथ मूल कर्सर विधि की तुलना करने के लिए प्रश्नों के लिए आंकड़ों और समय को मापें।