質問

実装する方法はありますか do while SQL Server 2008のループ?

役に立ちましたか?

解決

MS SQL Server 2008ではDo-Worlieについてはわかりませんが、Loop LoopのようにLoopロジックを変更することができます。

例はここから取られています: http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of-while-loop-with-continue-debreak-keywords/

  1. while loopの例

    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 Loopの例

    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. while loopの例は、キーワードを継続して破壊します

    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 キーワード、aをシミュレートするために使用できます DO / WHILE T-SQLで。 Pseudocodeで書かれた以下のかなり無意味な例を考えてみましょう。

SET I=1
DO
 PRINT I
 SET I=I+1
WHILE I<=10

GOTOを使用した同等のT-SQLコードは次のとおりです。

DECLARE @I INT=1;
START:                -- DO
  PRINT @I;
  SET @I+=1;
IF @I<=10 GOTO START; -- WHILE @I<=10

間の1つのマッピングに注意してください GOTO 有効化されたソリューションとオリジナル DO / WHILE 擬似コード。 aを使用した同様の実装 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 まれです。


繰り返し /まで、誰もが(T-SQLで動作しません)?

SET I=1
REPEAT
  PRINT I
  SET I=I+1
UNTIL I>10

... そしてその GOTO T-SQLのベースのソリューション:

DECLARE @I INT=1;
START:                    -- REPEAT
  PRINT @I;
  SET @I+=1;
IF NOT(@I>10) GOTO START; -- UNTIL @I>10

の創造的な使用を通じて GOTO とロジックの反転を介して NOT キーワード、元の擬似コードと GOTO ベースのソリューション。 aを使用した同様のソリューション 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 IF条件が反転していないため、ベースのソリューションはより簡単です。一方、それはまた、より冗長です。

の使用に関するすべての軽daのためではなかった場合 GOTO, 、これらは、明確にするためにT-SQLコードでこれらの特定の(邪悪な)ループ構造が必要な場合の数回の慣用的なソリューションでさえあります。

自分の裁量でこれらを使用して、仲間の開発者があなたを捕まえたときにあなたの仲間の開発者の怒りに苦しんでいないようにしようとしています GOTO.

私はこの記事を何度も読んだことを覚えているようです、そして答えはだけです 選ぶ 私が必要とするものに。

通常、私が必要だと思うとき DO WHILE T-SQLでは、カーソルを繰り返しているためであり、最適な透明度(最適な速度)を主に探しています。 T-SQLでは、それは適合していると思われます 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

残念ながら、T-SQLは、この無限のループよりもループ操作を単独で定義するよりクリーンな方法を提供していないようです。

コードをもう少し読みやすくする場合は、Exit変数を使用することもできます。

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

これは、より複雑なループがあり、ロジックを追跡しようとしている場合、おそらくより関連性があります。記載されているように、ループは高価なので、可能であれば他の方法を試してみてください。

ループはSQL Serverによって正式にサポートされている間にのみです。すでにあります 答え while loopのために。 SQL Serverでさまざまなタイプのループを達成する方法についての答えを詳述しています。

ご存知の場合は、とにかくループの最初のイテレーションを完了する必要があります、そしてあなたは試すことができます 一方を行います また 繰り返し SQL Serverのバージョン。

do .. while 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;

ループ用

DECLARE @cnt INT = 0;

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

PRINT 'Done FOR LOOP';

参照

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top