Partilhar via


Utilizar ciclos T-SQL para conjuntos de SQL dedicados no Azure Synapse Analytics

Neste artigo estão incluídas sugestões para o desenvolvimento de soluções de conjuntos de SQL dedicados com ciclos T-SQL e substituição de cursores.

Objetivo dos ciclos WHILE

Os conjuntos de SQL dedicados no Azure Synapse suportam 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 são úteis para substituir cursores definidos no código SQL. Felizmente, quase todos os cursores escritos no código SQL são da variedade de leitura rápida e só de leitura. Assim, os ciclos WHILE são uma ótima alternativa para substituir cursores.

Substituir cursores no conjunto de SQL dedicado

No entanto, antes de mergulhar primeiro na cabeça, deve colocar-se a seguinte pergunta: "Poderia este cursor ser reescrito para utilizar operações baseadas em conjunto?"

Em muitos casos, a resposta é sim e é frequentemente a melhor abordagem. Muitas vezes, uma operação baseada em conjunto tem um desempenho mais rápido do que uma abordagem iterativa, linha a linha.

Os cursores só de leitura avançados podem ser facilmente substituídos por uma construção em ciclo. O exemplo seguinte é 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.

Em primeiro lugar, 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, execute instruções em loop ao executá-las 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, remova 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.