একটি টেবিল পরিবর্তনশীল বা একটি অস্থায়ী টেবিল ব্যবহার করুন।
যেমনটি আগেই উল্লেখ করা হয়েছে, একটি কার্সার একটি শেষ অবলম্বন। বেশিরভাগ কারণ এটি এতে প্রচুর সংস্থান ব্যবহার করে, লকগুলি ইস্যু করে এবং এটি একটি চিহ্ন হতে পারে যা আপনি কীভাবে এসকিউএলকে সঠিকভাবে ব্যবহার করবেন তা বুঝতে পারছেন না।
পার্শ্ব দ্রষ্টব্য: আমি একবারে এমন একটি সমাধান পেয়েছিলাম যা সারণীতে সারিগুলি আপডেট করতে কার্সার ব্যবহার করে। কিছু তদন্তের পরে, এটি প্রমাণিত হয়েছিল যে পুরো জিনিসটি একটি একক আপডেটের কমান্ড দিয়ে প্রতিস্থাপন করা যেতে পারে। যাইহোক, এই ক্ষেত্রে, যেখানে একটি সঞ্চিত পদ্ধতি কার্যকর করা উচিত, একটি একক এসকিউএল-কমান্ড কাজ করবে না।
এর মতো একটি সারণী ভেরিয়েবল তৈরি করুন (আপনি যদি প্রচুর ডেটা নিয়ে কাজ করছেন বা মেমরির স্বল্প হয়ে থাকেন তবে পরিবর্তে একটি অস্থায়ী টেবিল ব্যবহার করুন):
DECLARE @menus AS TABLE (
id INT IDENTITY(1,1),
parent NVARCHAR(128),
child NVARCHAR(128));
id
গুরুত্বপূর্ণ।
প্রতিস্থাপন করুন parent
এবং child
কিছু ভাল ডেটা, উদাহরণস্বরূপ প্রাসঙ্গিক শনাক্তকারী বা ডেটা পুরো সেট চালিত করা সঙ্গে।
সারণীতে ডেটা Inোকান, যেমন:
INSERT INTO @menus (parent, child)
VALUES ('Some name', 'Child name');
...
INSERT INTO @menus (parent,child)
VALUES ('Some other name', 'Some other child name');
কিছু ভেরিয়েবল ঘোষণা করুন:
DECLARE @id INT = 1;
DECLARE @parentName NVARCHAR(128);
DECLARE @childName NVARCHAR(128);
এবং অবশেষে, টেবিলের ডেটা থেকে কিছুক্ষণ লুপ তৈরি করুন:
WHILE @id IS NOT NULL
BEGIN
SELECT @parentName = parent,
@childName = child
FROM @menus WHERE id = @id;
EXEC myProcedure @parent=@parentName, @child=@childName;
SELECT @id = MIN(id) FROM @menus WHERE id > @id;
END
প্রথম নির্বাচন অস্থায়ী সারণী থেকে ডেটা আনে। দ্বিতীয় নির্বাচন @ID আপডেট করে। MIN
কোনও সারি নির্বাচন না করা হলে শূন্য ফেরত দেয়।
টেবিলের সারি থাকাকালীন বিকল্প পদ্ধতিটি লুপ করা এবং SELECT TOP 1
টেম্প টেবিল থেকে নির্বাচিত সারিটি সরিয়ে ফেলতে হবে:
WHILE EXISTS(SELECT 1 FROM @menuIDs)
BEGIN
SELECT TOP 1 @menuID = menuID FROM @menuIDs;
EXEC myProcedure @menuID=@menuID;
DELETE FROM @menuIDs WHERE menuID = @menuID;
END;