132

do whileSQL Server 2008でループを実装する方法はありますか?

4

5 に答える 5

196

MS SQL Server 2008のDO-WHILEについてはよくわかりませんが、DO-WHILEループのように使用するようにWHILEループロジックを変更できます。

例はここから取られています:http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of-while-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
    

    ResultSet:

    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
    

    ResultSet:

    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
    

    ResultSet:

    1
    2
    3
    4
    5
    

ただし、データベースレベルでの ループは避けてください。参照

于 2010-12-20T07:08:28.247 に答える
67

キーワードにあまり腹を立てていない場合は、T-SQLで/GOTOをシミュレートするために使用できます。擬似コードで書かれた次のかなり無意味な例を考えてみましょう。DOWHILE

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

GOTO有効なソリューションと元のDO/WHILE擬似コードの間の1対1のマッピングに注意してください。ループを使用した同様の実装は、次の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の候補としてはあまり適切ではないため、もちろん、この特定の例を単純なループとして書き直すこともできます。/を必要とする正当なケースはまれであるため、適用性よりも例の簡潔さに重点が置かれました。DOWHILEDOWHILE


REPEAT / UNTIL、誰か(T-SQLでは機能しません)?

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

...およびGOTOT-SQLのベースソリューション:

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/の場合、if条件が反転されないためUNTILWHILEベースの解はより単純であるという議論をすることができます。一方で、それはより冗長でもあります。

の使用に関する軽蔑のすべてがなかった場合GOTO、これらは、明確にするためにT-SQLコードでこれらの特定の(邪悪な)ループ構造が必要な場合の慣用的な解決策でさえあるかもしれません。

彼らが非常に悪意のあるものを使用してあなたを捕まえたときにあなたの仲間の開発者の怒りに苦しむことのないように、あなた自身の裁量でこれらを使用してくださいGOTO

于 2011-06-28T03:00:35.137 に答える
20

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

通常、T-SQL で が必要になると思うDO WHILEのは、カーソルを反復処理しているためであり、主に最適な明快さ (対最適な速度) を探しています。WHILE TRUE/に合うと思われるT-SQLでは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 は、この無限ループよりも、ループ操作を単独で定義するためのより明確な方法を提供していないようです。

于 2014-03-12T04:40:08.677 に答える
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

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

于 2015-05-07T09:25:23.910 に答える