এসকিউএল সার্ভার 2008 এ লুপ করার সময় করুন Do


120

do whileএসকিউএল সার্ভার ২০০৮ এ লুপ প্রয়োগের জন্য কি কোনও পদ্ধতি আছে ?


5
রাহুলের দেওয়া উত্তরটি সঠিক তবে আপনি কী অর্জন করতে চাইছেন? লুপগুলি সেট ভিত্তিক সমাধানগুলির তুলনায় ব্যয়বহুল। সম্ভবত সম্পূর্ণরূপে একটি লুপ এড়ানো সম্ভব।
লিভেন কের্মসেকার্স

যদি সম্ভব হয় তবে লুপগুলি ব্যবহার করবেন না এবং আমি অনুমান করব যে 95% বা তার বেশি সময় এগুলি এড়ানো সম্ভব। লুপস এবং কার্সারগুলি পারফরম্যান্স কিলার এবং কমপক্ষে পাঁচ বছরের পারফরম্যান্স টিউনিংয়ের সাথে অভিজ্ঞ ডিবিএ নন এমন কাউকে কখনও লেখা উচিত নয়।
এইচএলজিইএম

1
Er। আপনি সামান্য নাটকীয়ভাবে এইচএলজিইএম, লুপস এবং কার্সারগুলি এতক্ষণ পর্যন্ত বেশ সুন্দর আপনি যতক্ষণ না কোনও টেবিলে প্রতিটি সারিতে লুপিং করছেন। আপনার যদি বিভাগ বা সাইটগুলির একটি তালিকা বা তুলনামূলকভাবে উচ্চ-স্তরের কিছু থাকে তবে আপনার ক্যোয়ারী চালানোর জন্য একটি লুপটি সবচেয়ে কার্যকর উপায় হতে পারে।
জেফ গ্রিসওয়াল্ড

উত্তর:


190

আমি এমএস এসকিউএল সার্ভার ২০০৮-এ ডু-হোয়েল সম্পর্কে নিশ্চিত নই তবে আপনি নিজের WHIP লুপ যুক্তিটি পরিবর্তন করতে পারেন, যাতে ডু-হুইল লুপের মতো ব্যবহার করতে পারেন।

উদাহরণগুলি এখান থেকে নেওয়া হয়েছে: http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of- moment-loop-with-continue-and-break-keywords/

  1. WHILE লুপের উদাহরণ

    DECLARE @intFlag INT
    SET @intFlag = 1
    WHILE (@intFlag <=5)
    BEGIN
        PRINT @intFlag
        SET @intFlag = @intFlag + 1
    END
    GO
    

    ফলাফল সেট:

    1
    2
    3
    4
    5
    
  2. 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
    
  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

তবে ডাটাবেস স্তরে লুপগুলি এড়াতে চেষ্টা করুন । রেফারেন্স


17
এখানে একই উদাহরণ দেওয়া হল, আপনি কি এই ওয়েবসাইটটির লেখক? blog.sqlauthority.com/2007/10/24/…
আনার খলিলভ

1
তিনি নন, তবে ব্যাপারটি কেন? সঠিক উত্তর দেওয়া হয়েছিল। অন্য ওয়েবসাইটে লিঙ্ক করা একটি ব্যথা, উত্তরটি অনুলিপি করা এবং এখানে আটকানো সহায়ক helpful
জিওফ গ্রিসওয়াল্ড

61

আপনি 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


6
+1: গ্রহণযোগ্য উত্তরের চেয়ে অবশ্যই প্রশ্নের উত্তর দেয়।
লুই কোটম্যান

আমি WHIL (1 = 1) পদ্ধতির পছন্দ করি, কারণ এটি ভয়ঙ্কর GOTO ব্যবহার না করেই উদ্দেশ্যটি কার্যকরীভাবে ফিট করে।
kad81

উভয় পদ্ধতিই বৈধ। আমি গোটো ব্যবহার করে সিউডো-লুপটি পছন্দ করি এটি বেশ চালাক।
জিওফ গ্রিসওয়াল্ড

18

আমি এই নিবন্ধটি একাধিকবার পড়ার কথা মনে করি এবং উত্তরটি আমার যা প্রয়োজন তা কেবল কাছেই

সাধারণত যখন আমি মনে করি যে 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

দুর্ভাগ্যক্রমে, টি-এসকিউএল এই অসীম লুপের চেয়ে লুপ ক্রিয়াকলাপকে এককভাবে সংজ্ঞায়িত করার জন্য একটি পরিষ্কার উপায় সরবরাহ করে না বলে মনে হয়।


কার্সর ব্যবহার করা কখনই একটি ভাল বিকল্প নয় কারণ এটি আসলে অনেক বেশি সংস্থান প্রয়োজন।
গ্রীকসত্তা

10
@ গ্রেট্রিট্রেট: ডাউন ডাউনদের জন্য ধন্যবাদ :) তবে আমি বিভ্রান্ত! যদি "একটি কার্সার কখনই ভাল বিকল্প হয় না", তবে এটি অবশ্যই সর্বদা একটি ভাল বিকল্প হতে হবে, তবে ডাউনভোট কেন? গুরুতরভাবে, যদিও স্পষ্টতই কার্সারগুলির অনেকগুলি ব্যবহারিক ব্যবহার রয়েছে: প্রাইভেট টেবিলের বিপরীতে, ছোট অপারেশনগুলির জন্য যেখানে স্পষ্টতা / ব্রেভিটি> পারফরম্যান্স, রক্ষণাবেক্ষণের কাজের জন্য, যেখানে নির্ধারক ক্রিয়াকলাপগুলি উপলভ্য নয়, নির্দিষ্ট অপারেশনগুলি অবশ্যই পারমাণবিক লেনদেন হিসাবে দেখা উচিত, ইত্যাদি। আমার সাম্প্রতিক ক্ষেত্রে, আমি আমার সঞ্চিত পদ্ধতির জন্য ব্যক্তিগত একটি ইনকামিং টেবিল ভেরিয়েবল খাচ্ছি। একটি পরম প্লিটিটিউড কখনও ভাল ধারণা হয় না!
শ্যানন

5
@ গ্রেট্রিট্রেট: সংক্ষেপে, কখনও কখনও পুনরাবৃত্ত হওয়া ডেটা কেবলমাত্র বিকল্প। আমি মনে করি আপনি এখনও তর্ক করতে পারেন এটি সেক্ষেত্রে একটি ভাল বিকল্প নয়, তবে এর অর্থ এই নয় যে এই ধরণের কোডটি অপ্রয়োজনীয় এবং ডাউনভোটের প্রয়োজন।
শ্যানন

1
আমি মনে করি ইন্টারনেটে এমন একজন লোকের সেনাবাহিনী রয়েছে যারা এসকিউএল এ লুপ এবং কার্সার ব্যবহার করে অন্য লোকেদের সম্পর্কে খুব, খুব রেগে থাকে। এই ওয়েবসাইটে আপনি যদি প্রায় 30 সেকেন্ড পরে এসকিউএল-তে একটি লুপ ব্যবহার করার কথা উল্লেখ করেন তবে আপনার ইনবক্সটি অজ্ঞ লোকদের দ্বারা প্লাবিত হবে যে আপনাকে কোনও পরিস্থিতিতে এগুলি ব্যবহার না করার জন্য বলে ...
জেফ গ্রিসওয়াল্ড

4

আপনি যদি নিজের কোডটি আরও বেশি পঠনযোগ্য হতে চান তবে আপনি একটি প্রস্থান ভেরিয়েবলও ব্যবহার করতে পারেন:

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

আপনার আরও জটিল লুপ থাকলে এবং যুক্তির উপর নজর রাখার চেষ্টা করার সময় এটি সম্ভবত আরও প্রাসঙ্গিক হবে। যেমন বলা হয়েছে লুপগুলি ব্যয়বহুল তাই চেষ্টা করুন এবং যদি পারেন তবে অন্যান্য পদ্ধতিগুলি ব্যবহার করুন।


মানে ... আমরা এমন একটি যুগে থাকি যেখানে আমাদের ডাটাবেস সার্ভারগুলির যে কোনও নির্দিষ্ট মুহুর্তে 10 থেকে 20 সিপিইউ কোর অলস থাকে এবং যেখানে আমাদের স্টোরেজ কন্ট্রোলারগুলি তাদের উপলব্ধ ব্যান্ডউইথ গিগাবিটগুলিতে পরিমাপ করে, তাই আমি নিশ্চিত নই যে এই প্রচলিত " প্রজ্ঞা "" LOOP = BAD "এখনও প্রযোজ্য।
জিওফ গ্রিসওয়াল্ড

1

কেবলমাত্র লুপটি আনুষ্ঠানিকভাবে এসকিউএল সার্ভার দ্বারা সমর্থিত। ইতিমধ্যে লুপ করার সময় ডিও এর উত্তর রয়েছে । আমি এসকিউএল সার্ভারে বিভিন্ন ধরণের লুপগুলি অর্জন করার উপায়গুলির উত্তরটি বিশদ দিচ্ছি।

যদি আপনি জানেন, যেভাবেই আপনাকে লুপের প্রথম পুনরাবৃত্তিটি সম্পন্ন করতে হবে, তবে আপনি এসকিউএল সার্ভারের ডিও..ওয়াইল বা পুনরায় পুনরায় চেষ্টা করতে পারেন ।

ডু..উইল লুপ

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';

উল্লেখ


এটি স্ট্যাকওভারফ্লো . com/ a/ 46362450/8239061 থেকে একটি অনুলিপি-পেস্ট-পুনঃক্রম হিসাবে মনে হচ্ছে ।
সিক্রেটএজেন্টম্যান

@ সেক্রেটজেন্টম্যান: উভয় উত্তরই বিভিন্ন প্রশ্নের উত্তর দিচ্ছে। উভয় জবাব দেওয়া অতিরিক্ত তথ্য।
সোমনাথ মুলুক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.