Usar loops T-SQL com SQL do Synapse no Azure Synapse Analytics
Este artigo fornece dicas essenciais para o uso de loops T-SQL, a substituição de cursores e o desenvolvimento de soluções relacionadas com o SQL do Synapse.
Finalidade de loops WHILE
O SQL do Synapse é compatível com o loop WHILE para executar repetidamente blocos de instruções. Esse loop WHILE continuará desde que as condições especificadas sejam verdadeiras ou até que o código especificamente encerre o loop usando a palavra-chave BREAK.
A execução de loops no SQL do Synapse é útil para a substituição de cursores definidos no código SQL. Felizmente, quase todos os cursores que são escritos em código SQL são do tipo somente leitura de avanço rápido. Portanto, loops WHILE são uma excelente alternativa para a substituição de cursores.
Substituir cursores no SQL do Synapse
Antes de mergulharmos no, a seguinte pergunta deve ser considerada: "o cursor poderia ser reescrito para usar operações baseadas em conjunto?" Em muitos casos, a resposta é sim, e essa geralmente é a melhor abordagem. Uma operação baseada em conjunto geralmente terá ums execução mais rápida do que uma abordagem iterativa de linha por linha.
Os cursores somente leitura de avanço rápido são facilmente substituídos por um constructo de looping. O código a seguir é um exemplo simples. Este exemplo de código atualiza as estatísticas para cada tabela no banco de dados. Iterando sobre as tabelas no loop, cada comando é executado em sequência.
Primeiro, crie uma tabela temporária que contém um número de linha exclusivo usado 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 loop:
DECLARE @nbr_statements INT = (SELECT COUNT(*) FROM #tbl)
, @i INT = 1
;
Agora, execute um loop sobre as instruções para executar uma por 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
Finalmente, descarte a tabela temporária criada na primeira etapa
DROP TABLE #tbl;
Próximas etapas
Para obter mais dicas de desenvolvimento, confira visão geral de desenvolvimento.