do while
এসকিউএল সার্ভার ২০০৮ এ লুপ প্রয়োগের জন্য কি কোনও পদ্ধতি আছে ?
do while
এসকিউএল সার্ভার ২০০৮ এ লুপ প্রয়োগের জন্য কি কোনও পদ্ধতি আছে ?
উত্তর:
আমি এমএস এসকিউএল সার্ভার ২০০৮-এ ডু-হোয়েল সম্পর্কে নিশ্চিত নই তবে আপনি নিজের WHIP লুপ যুক্তিটি পরিবর্তন করতে পারেন, যাতে ডু-হুইল লুপের মতো ব্যবহার করতে পারেন।
উদাহরণগুলি এখান থেকে নেওয়া হয়েছে: http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of- moment-loop-with-continue-and-break-keywords/
WHILE লুপের উদাহরণ
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 END GO
ফলাফল সেট:
1 2 3 4 5
BREAK কীওয়ার্ড সহ WHILE লুপের উদাহরণ
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 IF @intFlag = 4 BREAK; END GO
ফলাফল সেট:
1 2 3
CONTINUE এবং BREAK কীওয়ার্ড সহ WHILE লুপের উদাহরণ
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 CONTINUE; IF @intFlag = 4 -- This will never executed BREAK; END GO
ফলাফল সেট:
1 2 3 4 5
তবে ডাটাবেস স্তরে লুপগুলি এড়াতে চেষ্টা করুন । রেফারেন্স ।
আপনি GOTO
কীওয়ার্ড দ্বারা খুব বিরক্ত না হলে এটি টি DO
/ WHILE
এসকিউএল অনুকরণ করতে ব্যবহার করতে পারেন । সিউডোকোডে লিখিত নীচের বরং অযৌক্তিক উদাহরণ বিবেচনা করুন:
SET I=1
DO
PRINT I
SET I=I+1
WHILE I<=10
এখানে গোটো ব্যবহার করে টি-এসকিউএল কোডের সমতুল্য:
DECLARE @I INT=1;
START: -- DO
PRINT @I;
SET @I+=1;
IF @I<=10 GOTO START; -- WHILE @I<=10
GOTO
সক্ষম সমাধান এবং মূল DO
/ WHILE
সিউডোকোডের মধ্যে এক থেকে একের ম্যাপিং লক্ষ করুন । একটি WHILE
লুপ ব্যবহার করে অনুরূপ বাস্তবায়ন দেখতে পাবেন:
DECLARE @I INT=1;
WHILE (1=1) -- DO
BEGIN
PRINT @I;
SET @I+=1;
IF NOT (@I<=10) BREAK; -- WHILE @I<=10
END
এখন, আপনি অবশ্যই এই বিশেষ উদাহরণটিকে একটি সাধারণ WHILE
লুপ হিসাবে অবশ্যই পুনরায় লিখতে পারেন , যেহেতু এটি কোনও DO
/ WHILE
নির্মাণের পক্ষে ভাল প্রার্থী নয় । প্রয়োগের পরিবর্তে উদাহরণস্বরূপ ব্রিভির উপর জোর দেওয়া হয়েছিল, যেহেতু বৈধ ক্ষেত্রে DO
/ WHILE
এর প্রয়োজন হয় বিরল।
পুনরায় / UNTIL, যে কেউ (টি এসকিউএল এ কাজ করে না)?
SET I=1
REPEAT
PRINT I
SET I=I+1
UNTIL I>10
... এবং GOTO
টি-এসকিউএল ভিত্তিক সমাধান:
DECLARE @I INT=1;
START: -- REPEAT
PRINT @I;
SET @I+=1;
IF NOT(@I>10) GOTO START; -- UNTIL @I>10
মূল শব্দটির মাধ্যমে সৃজনশীল ব্যবহার GOTO
এবং লজিক বিপর্যয়ের মাধ্যমে NOT
মূল সিউডোকোড এবং GOTO
ভিত্তিক সমাধানের মধ্যে খুব ঘনিষ্ঠ সম্পর্ক রয়েছে । WHILE
লুপ ব্যবহার করে অনুরূপ সমাধানটি দেখতে দেখতে পাওয়া যায়:
DECLARE @I INT=1;
WHILE (1=1) -- REPEAT
BEGIN
PRINT @I;
SET @I+=1;
IF @I>10 BREAK; -- UNTIL @I>10
END
একটি যুক্তি যে ক্ষেত্রে জন্য তৈরি করা যেতে পারে REPEAT
/ UNTIL
, WHILE
ভিত্তিক সমাধান সহজ, কারণ যদি শর্ত বিপর্যস্ত করা হয় না। অন্যদিকে এটি আরও ভার্বোস।
যদি এটি ব্যবহারের ঘৃণা সকলের GOTO
পক্ষে না হয়, তবে স্পষ্টতার স্বার্থে টি-এসকিউএল কোডে যখন এই নির্দিষ্ট (অশুভ) লুপিং কনস্ট্রাক্টস প্রয়োজন হয় তখন এগুলি কয়েকবারের জন্য মূর্তিবাদী সমাধানও হতে পারে।
এগুলি আপনার নিজের বিবেচনার ভিত্তিতে ব্যবহার করুন, যখন আপনার সহকর্মী বিকাশকারীরা আপনাকে বেশি ম্যালেন্ডেড ব্যবহার করে ধরা দেয় তখন তাদের ক্রোধের শিকার না হওয়ার চেষ্টা করে GOTO
।
আমি এই নিবন্ধটি একাধিকবার পড়ার কথা মনে করি এবং উত্তরটি আমার যা প্রয়োজন তা কেবল কাছেই ।
সাধারণত যখন আমি মনে করি যে DO WHILE
টি-এসকিউএল- তে আমার একটি দরকার হবে কারণ এটি আমি একটি কার্সার পুনরুক্তি করছি, এবং আমি বেশিরভাগ ক্ষেত্রে সর্বোত্তম স্পষ্টতার জন্য খুঁজছি (বনাম অনুকূল গতি)। টি-এসকিউএলে এটি একটি WHILE TRUE
/ ফিট করে বলে মনে হচ্ছে IF BREAK
।
যদি সেই পরিস্থিতিটি আপনাকে এখানে এনে দেয় তবে এই স্নিপেটটি আপনাকে একটি মুহূর্ত বাঁচাতে পারে। অন্যথায়, আমাকে আবার স্বাগতম। এখন আমি নিশ্চিত হতে পারি যে আমি এখানে একাধিকবার এসেছি। :)
DECLARE Id INT, @Title VARCHAR(50)
DECLARE Iterator CURSOR FORWARD_ONLY FOR
SELECT Id, Title FROM dbo.SourceTable
OPEN Iterator
WHILE 1=1 BEGIN
FETCH NEXT FROM @InputTable INTO @Id, @Title
IF @@FETCH_STATUS < 0 BREAK
PRINT 'Do something with ' + @Title
END
CLOSE Iterator
DEALLOCATE Iterator
দুর্ভাগ্যক্রমে, টি-এসকিউএল এই অসীম লুপের চেয়ে লুপ ক্রিয়াকলাপকে এককভাবে সংজ্ঞায়িত করার জন্য একটি পরিষ্কার উপায় সরবরাহ করে না বলে মনে হয়।
আপনি যদি নিজের কোডটি আরও বেশি পঠনযোগ্য হতে চান তবে আপনি একটি প্রস্থান ভেরিয়েবলও ব্যবহার করতে পারেন:
DECLARE @Flag int = 0
DECLARE @Done bit = 0
WHILE @Done = 0 BEGIN
SET @Flag = @Flag + 1
PRINT @Flag
IF @Flag >= 5 SET @Done = 1
END
আপনার আরও জটিল লুপ থাকলে এবং যুক্তির উপর নজর রাখার চেষ্টা করার সময় এটি সম্ভবত আরও প্রাসঙ্গিক হবে। যেমন বলা হয়েছে লুপগুলি ব্যয়বহুল তাই চেষ্টা করুন এবং যদি পারেন তবে অন্যান্য পদ্ধতিগুলি ব্যবহার করুন।
কেবলমাত্র লুপটি আনুষ্ঠানিকভাবে এসকিউএল সার্ভার দ্বারা সমর্থিত। ইতিমধ্যে লুপ করার সময় ডিও এর উত্তর রয়েছে । আমি এসকিউএল সার্ভারে বিভিন্ন ধরণের লুপগুলি অর্জন করার উপায়গুলির উত্তরটি বিশদ দিচ্ছি।
যদি আপনি জানেন, যেভাবেই আপনাকে লুপের প্রথম পুনরাবৃত্তিটি সম্পন্ন করতে হবে, তবে আপনি এসকিউএল সার্ভারের ডিও..ওয়াইল বা পুনরায় পুনরায় চেষ্টা করতে পারেন ।
DECLARE @X INT=1;
WAY: --> Here the DO statement
PRINT @X;
SET @X += 1;
IF @X<=10 GOTO WAY;
DECLARE @X INT = 1;
WAY: -- Here the REPEAT statement
PRINT @X;
SET @X += 1;
IFNOT(@X > 10) GOTO WAY;
DECLARE @cnt INT = 0;
WHILE @cnt < 10
BEGIN
PRINT 'Inside FOR LOOP';
SET @cnt = @cnt + 1;
END;
PRINT 'Done FOR LOOP';