do while
SQL Server 2008でループを実装する方法はありますか?
do while
SQL Server 2008でループを実装する方法はありますか?
回答:
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
ただし、データベースレベルでのループは避けてください。 リファレンス。
GOTO
キーワードにあまり気分を害していない場合は、T-SQLで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
/ UNTIL
、WHILE
もし条件が反転していないので、ベースのソリューションは、簡単です。一方、それはまたより冗長です。
の使用に関する軽視のすべてがそうでなかった場合GOTO
、これらの特定の(悪)ループ構造がT-SQLコードで明確にするために必要な場合は、これらが数回の慣例的な解決策になることもあります。
自分の裁量でこれらを使用し、悪意のあるユーザーがあなたを捕まえたときに他の開発者の怒りを被らないようにしてくださいGOTO
。
私はこの記事を何度も読んだことを思い出しているようで、答えは私が必要としているものに近いだけです。
通常DO WHILE
、T-SQLでが必要になると思うのは、カーソルを反復しているためです。最適な明快さ(最適速度と比べて)を主に探しています。T-SQLではWHILE TRUE
/ に合うようIF BREAK
です。
それがここにあなたを連れてきたシナリオであるなら、このスニペットはあなたを一瞬節約するかもしれません。そうでなければ、おかえりなさい、私。これで、ここに2度以上来たことがあると確信できます。:)
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
これはおそらく、より複雑なループがあり、ロジックを追跡しようとしている場合に、より適切です。述べたようにループは高価なので、可能であれば他の方法を試してみてください。
WhileループのみがSQLサーバーによって正式にサポートされています。DO whileループの答えはすでにあります。SQL Serverでさまざまな種類のループを実現する方法について詳しく説明しています。
わかっている場合は、とにかくループの最初の反復を完了する必要がある場合、SQLサーバーのDO..WHILEまたはREPEAT..UNTILバージョンを試すことができます。
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';