এসকিউএল সার্ভারে লুপের সিনট্যাক্স


238

forটিএসকিউএলে একটি লুপের সিনট্যাক্সটি কী ?


10
আপনি যা ব্যবহার করছেন তার তুলনায় এসকিউএল একটি খুব আলাদা ভাষা। এটি কী , কীভাবে নয় তার দিকে দৃষ্টি নিবদ্ধ করে । আপনি এসকিউএল সার্ভারকে কী ফলাফল চান তা বলুন এবং উত্তরটি কীভাবে তৈরি করা যায় তা নির্ধারণ করুন। বা, আমি যা বলেছি তা পুনর্বিবেচনা করতে - এসকিউএল-এ লুপের জন্য কোনও নেই।
ড্যামিয়েন_এ_বিশ্বাসীরা

5
WHILE @I < 10; SET @I = @I + 1; BEGIN; ...; END? তবে এটি বেশিরভাগ ক্যোয়ারী প্রসেসিংয়ের জন্য ব্যবহার করা উচিত নয় (তবে কখনও কখনও অপরিহার্য কারসাজির জন্য প্রয়োজন)। "লুপের জন্য tsql" ব্যবহার করে গুগলে এই জাতীয় অনেক নির্দেশাবলী / ইঙ্গিত পাওয়া যায়।

7
JOINs এবং সেট অপারেশনগুলির পক্ষে লুপগুলি এড়িয়ে চলুন।
ওডে

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

2
কখনও কখনও এটি পরীক্ষার ডেটাবেসে পরীক্ষার ডেটা দ্রুত জঞ্জাল করতে ব্যবহার করা যেতে পারে যা আপনি কেবল তারপরেই এরপরেই মুছে ফেলতে যাচ্ছেন। সেক্ষেত্রে এটি ব্যবহারের ফলে সি # এর মতো আরও কিছু লিখিত একটি পৃথক প্রোগ্রামের মধ্য দিয়ে যাওয়ার প্রয়োজনকে সরিয়ে দেওয়া হয়, এবং প্রকৌশল বিশেষত কোনও বড় উদ্বেগ নয়। আবার, আমি এটি পরীক্ষার তথ্যের ক্ষেত্রে বলছি।
Panzercrisis

উত্তর:


210

টি-এসকিউএলের একটি FORলুপ নেই, এটির একটি WHILEলুপ
WHIL (লেনদেন-এসকিউএল) রয়েছে

WHILE Boolean_expression
BEGIN

END

8
যোগদানকারীদের (এবং সেট অপারেশনগুলি) এসকিউএল এর লুপিং কনস্ট্রাক্টসের চেয়ে বেশি পছন্দ করা উচিত।
ওডে

6
স্ট্রেস করার কোনও সীমা নেই (বিশেষত এসকিউএল-এ নতুন যারা তাদের জন্য), ড্যামিয়েন যা বলেছিলেন: "আপনার ব্যবহৃত ব্যবহারকারীর তুলনায় এসকিউএল হ'ল একটি আলাদা ভাষা It's এটি কীসের দিকে মনোনিবেশ করা হয়েছে, কীভাবে নয় You আপনি এসকিউএল সার্ভারকে কী বলুন ফলাফল আপনি চান, এবং উত্তরটি কীভাবে তৈরি করা যায় তা নির্ধারণ করুন ""
ypercubeᵀᴹ

1
মাইক্রোসফ্ট ডকুমেন্টেশন এখানে লক্ষণীয় আকর্ষণীয় সত্যই। যখন বুলিয়ান এক্সপ্রেশন নেয় না - এটি একটি প্রাকটিক লাগে - যা সত্য বা মিথ্যা মূল্যায়ন করতে সক্ষম হওয়া ছাড়াও অজানাও হতে পারে।
ড্যামিয়েন_এই_বিশ্বাসীরা

360

কোনও লুপ নেই, কেবলমাত্র লুপ লুপ:

DECLARE @i int = 0

WHILE @i < 20
BEGIN
    SET @i = @i + 1
    /* do some work */
END

20
এটি লক্ষ করুন যে আপনি যদি লুপটিতে সূচকটি ব্যবহার করতে চান তবে আপনার ব্যবহারের ক্ষেত্রে উপর নির্ভর করে আপনি প্রথমে পরিবর্তে শেষ জিনিসটি বাড়িয়ে দিতে পারেন।
জিঙ্গলেস্তুলা

3
এছাড়াও লক্ষ্য করুন যে স্থানীয় ভেরিয়েবলের জন্য ডিফল্ট মান প্লেইন এসকিউএল সমর্থন করে না। SET @i = 0লুপের জন্য আপনার আগে আলাদা প্রয়োজন ।
Nux

1
@ নাক্স: 0 টি সুস্পষ্টভাবে ঘোষণার সময় সেট করা হয়েছে
টিসিকেস

7
হ্যাঁ, তবে এটি পুরানো এসকিউএল সার্ভারগুলিতে কাজ করে না (কমপক্ষে 2005-এ নয়)।
Nux

এছাড়াও, এটি লক্ষ করা উচিত যে সাধারণত পূর্ণসংখ্যা বৃদ্ধি হওয়ার আগে কাজ করা হয়। এসকিউএল-এর লুপগুলির জন্য অনেকগুলি তাদের কাজের ক্ষেত্রে সেই পূর্ণসংখ্যাটি ব্যবহার করে (সারি থেকে সারি থেকে বারে বারে বা টেম্প টেবিলগুলির ফলস্বরূপ) ফলস্বরূপ যদি শেষের পরিবর্তে চক্রের শুরুতে ঘটে তবে তা ফেলে দেওয়া যেতে পারে।
সিএসএস

34

অতিরিক্ত তথ্য

যেহেতু কেউ কোনও উত্তর পোস্ট করেছে তা যুক্ত করার জন্য এটি কীভাবে লুপের অভ্যন্তরে একটি ডেটাসেট যদিও পুনরাবৃত্তি করতে পারে তা অন্তর্ভুক্ত করে আপনি কীভাবে কীভাবে অফফেট ফিচারটি ব্যবহার করতে পারেন ।

ব্যবহার

DECLARE @i INT = 0;
SELECT @count=  Count(*) FROM {TABLE}

WHILE @i <= @count
BEGIN

    SELECT * FROM {TABLE}
    ORDER BY {COLUMN}
    OFFSET @i ROWS   
    FETCH NEXT 1 ROWS ONLY  

    SET @i = @i + 1;

END

2
কার্সার ব্যবহারের জন্য দুর্দান্ত বিকল্প।
দান্তেস্মিত 10

28

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

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

18
এটি স্ব-ব্যাখ্যামূলক।
এডওয়ার্ড ওলামিসান

4
এটি কীভাবে স্ব ব্যাখ্যাযোগ্য নয়? আমার একই প্রশ্ন ছিল, আমি এখনই উত্তরটি বুঝতে পেরেছি।
দান্তে স্মিথ 10

1
এই উত্তরটি নামকরণ কনভেনশন বাদে @ টিসিকে থেকে কীভাবে আলাদা?
সুশীল যাদব

7

এটি সম্পর্কে:

BEGIN
   Do Something
END
GO 10

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


3
'জিও 10'? এসকিউএল সার্ভার 2008 এটি পছন্দ করে না।
রিসোর্স

7

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

লুপের জন্য

DECLARE @cnt INT = 0;

WHILE @cnt < 10
BEGIN
   PRINT 'Inside FOR LOOP';
   SET @cnt = @cnt + 1;
END;

PRINT 'Done FOR LOOP';

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

ডু..উইল লুপ

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;

উল্লেখ


এই জুলুম এখানে কপি-পেস্ট-পুনর্বিন্যস্তভাবে হয়েছে বলে মনে হচ্ছে stackoverflow.com/a/46363319/8239061
SecretAgentMan

@ সেক্রেটজেন্টম্যান: উভয় উত্তরই বিভিন্ন প্রশ্নের উত্তর দিচ্ছে। উভয় জবাব দেওয়া অতিরিক্ত তথ্য।
সোমনাথ মুলুক

6

সহজ উত্তর NO !!

FORএসকিউএল-তে কোনও নেই , তবে আপনি কীভাবে কাজ করবেন তা আপনি ব্যবহার করতে WHILEবা GOTOঅর্জন করতে পারেন FOR

যখন:

DECLARE @a INT = 10

WHILE @a <= 20
BEGIN
    PRINT @a
    SET @a = @a + 1
END

যাও :

DECLARE @a INT = 10
a:
PRINT @a
SET @a = @a + 1
IF @a < = 20
BEGIN
    GOTO a
END

আমি সবসময় বিবৃতি WHILEচেয়ে পছন্দ করি GOTO


1
আমি পছন্দ করি আপনি কীভাবে উভয় বিকল্পের উল্লেখ করেছেন কেবলমাত্র 1
টির

0

টি-এসকিউএলে লুপ উদাহরণ রয়েছে যা চলতি মাসের শেষের তারিখের তালিকা করে।

DECLARE @Today DATE= GETDATE() ,
@StartOfMonth DATE ,
@EndOfMonth DATE;

DECLARE @DateList TABLE ( DateLabel VARCHAR(10) );
SET @EndOfMonth = EOMONTH(GETDATE());
SET @StartOfMonth = DATEFROMPARTS(YEAR(@Today), MONTH(@Today), 1);

WHILE @StartOfMonth <= @EndOfMonth
BEGIN
    INSERT  INTO @DateList
    VALUES  ( @StartOfMonth );
    SET @StartOfMonth = DATEADD(DAY, 1, @StartOfMonth);
END;

SELECT  DateLabel
FROM    @DateList;  

0

এটি চেষ্টা করুন, এটি শিখুন:

DECLARE @r INT = 5
DECLARE @i INT = 0
DECLARE @F varchar(max) = ''
WHILE @i < @r
BEGIN

    DECLARE @j INT = 0
    DECLARE @o varchar(max) = ''
    WHILE @j < @r - @i - 1
    BEGIN
        SET @o = @o + ' '
        SET @j += 1
    END

    DECLARE @k INT = 0
    WHILE @k < @i + 1
    BEGIN
        SET @o = @o + ' *'  -- '*'
        SET @k += 1
    END
    SET @i += 1
    SET @F = @F + @o + CHAR(13)
END
PRINT @F

তারিখ সহ:

DECLARE @d DATE = '2019-11-01'
WHILE @d < GETDATE()
BEGIN
    PRINT @d
    SET @d = DATEADD(DAY,1,@d)
END
PRINT 'n'
PRINT @d
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.