do while
SQL Server 2008でループを実装する方法はありますか?
5 に答える
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/
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
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
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
ただし、データベースレベルでの ループは避けてください。参照。
キーワードにあまり腹を立てていない場合は、T-SQLで/GOTO
をシミュレートするために使用できます。擬似コードで書かれた次のかなり無意味な例を考えてみましょう。DO
WHILE
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
の候補としてはあまり適切ではないため、もちろん、この特定の例を単純なループとして書き直すこともできます。/を必要とする正当なケースはまれであるため、適用性よりも例の簡潔さに重点が置かれました。DO
WHILE
DO
WHILE
REPEAT / UNTIL、誰か(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
を使用した同様のソリューションは次のようになります。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条件が反転されないためUNTIL
、WHILE
ベースの解はより単純であるという議論をすることができます。一方で、それはより冗長でもあります。
の使用に関する軽蔑のすべてがなかった場合GOTO
、これらは、明確にするためにT-SQLコードでこれらの特定の(邪悪な)ループ構造が必要な場合の慣用的な解決策でさえあるかもしれません。
彼らが非常に悪意のあるものを使用してあなたを捕まえたときにあなたの仲間の開発者の怒りに苦しむことのないように、あなた自身の裁量でこれらを使用してくださいGOTO
。
この記事を何度も読んだことを覚えているようですが、答えは私が必要としているものに近いものです。
通常、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 は、この無限ループよりも、ループ操作を単独で定義するためのより明確な方法を提供していないようです。
コードをもう少し読みやすくしたい場合は、終了変数を使用することもできます。
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
これは、より複雑なループがあり、ロジックを追跡しようとしている場合に、おそらくより関連性があります。前述のように、ループはコストがかかるため、可能であれば他の方法を試してみてください。