📋 Descrição
No SQL Server, o update recursivo é uma técnica avançada usada para realizar múltiplas atualizações em um campo de maneira iterativa. A principal vantagem dessa abordagem é permitir que o processo de atualização continue enquanto houver registros que precisem ser alterados. Uma maneira eficaz de implementar isso é utilizando um loop com a condição WHILE @@ROWCOUNT, que garante que a operação de atualização seja repetida até que não haja mais mudanças.
Essa técnica é extremamente útil em cenários onde precisamos agregar dados ou consolidar informações de várias linhas em uma única linha ou campo. A consulta abaixo ilustra como realizar esse tipo de atualização recursiva.
🛠️ Exemplo de Código
Neste exemplo, é realizada a atualização recursiva de uma tabela temporária, #NotaDevoClbr, com informações provenientes de outra tabela temporária, #NotaClbr. O objetivo é consolidar as informações de múltiplas notas de devolução em um único campo.
-- Criação da tabela temporária #NotaDevoClbr
SELECT DISTINCT
nr_documento,
cd_item,
qt_saida,
soma_ret,
nota_ret,
saldo,
dt_lancto,
nr_notadevol = convert(VARCHAR(2000),'|') INTO #NotaDevoClbr FROM #NotaClbr;
-- Loop recursivo para realizar a atualização
WHILE @@ROWCOUNT > 0
BEGIN
UPDATE c SET
c.nr_notadevol = c.nr_notadevol + convert(VARCHAR(7),l.[nr_nota]) + '='+ convert(VARCHAR(7),l.[QtdeDev]) + '|'
FROM
#NotaDevoClbr c
INNER JOIN #NotaClbr l
ON c.nr_documento = l.nr_documento
AND charindex(
'|' +
convert(VARCHAR(7),l.[nr_nota]) +
'='+
convert(VARCHAR(7),l.[qtde_dev]) +
'|', c.nr_notadevol,1) = 0
END;
📊 Explicação do Código
-
Seleção Inicial e Criação da Tabela Temporária
A primeira parte da consulta utiliza o comando SELECT DISTINCT para selecionar registros únicos das colunas especificadas e armazená-los na tabela temporária #NotaDevoClbr. A coluna nr_notadevol é inicializada com uma string vazia ('|'). -
Loop Recursivo com WHILE @@ROWCOUNT
A condição WHILE @@ROWCOUNT > 0 garante que o loop continue executando enquanto houver registros sendo atualizados.
Dentro do loop, a instrução UPDATE concatena os valores das notas de devolução (nr_nota) e as quantidades devolvidas (QtdeDev) na coluna nr_notadevol da tabela #NotaDevoClbr.
O INNER JOIN entre #NotaDevoClbr e #NotaClbr é feito com base na coluna nr_documento.
A função CHARINDEX verifica se a combinação de nr_nota e QtdeDev já foi registrada na coluna nr_notadevol. Se não estiver presente, a concatenação é feita.
💡 Exemplo de Caso de Uso
Suponha que você esteja trabalhando em um sistema de gestão de notas fiscais para uma empresa de comércio, onde é necessário consolidar as informações de devoluções de produtos. Em uma única transação de devolução, pode haver várias notas de devolução associadas a um único documento fiscal. A tabela #NotaClbr contém as notas de devolução e as quantidades devolvidas, enquanto a tabela #NotaDevoClbr precisa consolidar essas informações em um único campo.
Por exemplo, para o documento fiscal nr_documento = 12345, as notas de devolução podem ser:
Após executar a consulta de update recursivo, o campo nr_notadevol na tabela #NotaDevoClbr será atualizado da seguinte forma:
Essa operação de atualização recursiva permite consolidar as informações de devolução em um único campo, facilitando relatórios e a análise de dados.
🚀 Conclusão
A técnica de update recursivo utilizando WHILE @@ROWCOUNT no SQL Server é muito útil quando é necessário realizar múltiplas atualizações condicionais ou iterativas em registros. Este exemplo de consolidação de dados de devolução é apenas um dos muitos casos em que essa técnica pode ser aplicada, podendo ser utilizada em diversos cenários que exigem agregação de informações em um único campo.
✅ Compreender e implementar atualizações recursivas pode melhorar significativamente a eficiência no tratamento de dados complexos no seu banco de dados.