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.