次の方法で共有


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

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

WHILE ループの目的

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

Synapse SQL のループは、SQL コードで定義されているカーソルを置き換える場合に便利です。 さいわい、SQL コードで記述されるほとんどすべてのカーソルは、高速で読み取り専用です。 したがって、WHILE ループは、カーソルを置き換える場合に最適な代替手段です。

Synapse SQL のカーソルを置き換える

開始する前に、次の質問を考慮する必要があります。"このカーソルはセット ベースの操作を使用するように書き換えられますか?多くの場合、答えははいであり、多くの場合、最良のアプローチです。 セットベースの操作は、多くの場合、反復的な行単位のアプローチよりも高速に実行されます。

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

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

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;

次のステップ

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