Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este artigo inclui dicas para o desenvolvimento de soluções de pool SQL dedicadas usando loops T-SQL e substituindo cursores.
Finalidade de ciclos WHILE
Os pools SQL dedicados no Azure Synapse dão suporte ao loop WHILE para executar repetidamente blocos de instrução. Esse loop WHILE continua enquanto as condições especificadas forem verdadeiras ou até que o código termine especificamente o loop usando a palavra-chave BREAK.
Os loops são úteis para substituir cursores definidos no código SQL. Felizmente, quase todos os cursores que são escritos em código SQL são da variedade de deslocamento rápido, somente leitura. Assim, os loops WHILE são uma ótima alternativa para substituir cursores.
Substituindo cursores no pool SQL dedicado
No entanto, antes de mergulhar de cabeça, deve-se fazer a seguinte pergunta: "Este cursor poderia ser reescrito para usar operações baseadas em conjuntos?"
Em muitos casos, a resposta é sim e é frequentemente a melhor abordagem. Uma operação baseada em conjunto geralmente tem um desempenho mais rápido do que uma abordagem iterativa, linha por linha.
Os cursores somente leitura de avanço rápido podem ser facilmente substituídos por uma estrutura de ciclo. O exemplo a seguir é simples. Este exemplo de código atualiza as estatísticas de cada tabela no banco de dados. Ao fazer a iteração sobre as tabelas no loop, cada comando é executado em sequência.
Primeiro, crie uma tabela temporária contendo um número de linha exclusivo usado para identificar as declaraçõ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, faça um loop pelas instruções, executando-as 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
Finalmente, solte a tabela temporária criada na primeira etapa
DROP TABLE #tbl;
Próximos passos
Para obter mais dicas de desenvolvimento, consulte Visão geral do desenvolvimento.