Share via


Azure Synapse Analytics の Synapse SQL で T-SQL ループを使用する

この記事では、Synapse SQL での T-SQL ループの使用、カーソルの置換、関連ソリューションの開発に関する重要なヒントを提供します。

WHILE ループの目的

Synapse SQL では、ステートメント ブロックを繰り返し実行するための WHILE ループがサポートされています。 この WHILE ループは、指定された条件が true の場合に限り、またはコードが BREAK キーワードを使用してループを終了するまで実行されます。

Synapse SQL のループは、SQL コードで定義されているカーソルを置き換える際に便利です。 また、SQL コードで記述されているほとんどすべてのカーソルは、高速順方向、読み取り専用など豊富です。 そのため、WHILE ループはカーソルの置換の優れた代替手段です。

Synapse SQL でのカーソルの置換

取り込む前に、"このカーソルはセットベースの操作を使用するように書き直すことができるか?" という質問を検討する必要があります。 多くの場合、答えは "はい" であり、この方法が最適です。 セット ベースの操作は、1 行ずつの反復的なアプローチをとるよりも速く実行されます。

高速順方向の読み取り専用カーソルは、ループ構造で簡単に置き換えられます。 次のコードは、シンプルな例です。 このコード例は、データベース内のすべてのテーブルの統計を更新します。 ループ内のテーブルを反復処理することで、各コマンドは順番に実行されます。

最初に、個々のステートメントを識別するための一意の行番号が含まれている、一時テーブルを作成します。

CREATE TABLE #tbl
WITH
( DISTRIBUTION = ROUND_ROBIN
)
AS
SELECT  ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Sequence
,       [name]
,       'UPDATE STATISTICS '+QUOTENAME([name]) AS sql_code
FROM    sys.tables
;

次に、ループの実行に必要な変数を初期化します。

DECLARE @nbr_statements INT = (SELECT COUNT(*) FROM #tbl)
,       @i INT = 1
;

1 つずつ実行するステートメントをループします。

WHILE   @i <= @nbr_statements
BEGIN
    DECLARE @sql_code NVARCHAR(4000) = (SELECT sql_code FROM #tbl WHERE Sequence = @i);
    EXEC    sp_executesql @sql_code;
    SET     @i +=1;
END

最後に、最初の手順で作成した一時テーブルを削除します。

DROP TABLE #tbl;

次のステップ

開発についてのその他のヒントは、開発の概要に関するページをご覧ください。