Utilizar ciclos T-SQL com o SQL do Synapse no Azure Synapse Analytics

Este artigo fornece-lhe sugestões essenciais para utilizar ciclos T-SQL, substituir cursores e desenvolver soluções relacionadas com o Synapse SQL.

Objetivo dos ciclos WHILE

O Synapse SQL suporta o ciclo WHILE para executar repetidamente blocos de instrução. Este ciclo WHILE continua enquanto as condições especificadas forem verdadeiras ou até que o código termine especificamente o ciclo com a palavra-chave BREAK.

Os ciclos no SQL do Synapse são úteis para substituir os cursores definidos no código SQL. Felizmente, quase todos os cursores escritos no código SQL são da variedade rápida e só de leitura. Assim, os ciclos WHILE são uma ótima alternativa para substituir cursores.

Substituir cursores no SQL do Synapse

Antes de começar, deve considerar-se a seguinte pergunta: "Poderá este cursor ser reescrito para utilizar operações baseadas em conjunto?" Em muitos casos, a resposta é sim e é frequentemente a melhor abordagem. Uma operação baseada em conjunto executa frequentemente mais rapidamente do que uma abordagem iterativa, linha a linha.

Os cursores só de leitura são facilmente substituídos por uma construção em loop. O código seguinte é um exemplo simples. Este exemplo de código atualiza as estatísticas de cada tabela na base de dados. Ao iterar sobre as tabelas no ciclo, cada comando é executado em sequência.

Primeiro, crie uma tabela temporária que contenha um número de linha exclusivo utilizado para identificar as instruções individuais:

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
;

Em segundo lugar, inicialize as variáveis necessárias para executar o ciclo:

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

Agora, veja as instruções que as executam uma de cada vez:

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

Por fim, largue a tabela temporária criada no primeiro passo

DROP TABLE #tbl;

Passos seguintes

Para obter mais sugestões de desenvolvimento, veja Descrição geral do desenvolvimento.