SQL Server 2008でループを実行します
-
11-10-2019 - |
質問
実装する方法はありますか 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/
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
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
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';