SQL Server - Update Recursivo 🔄

📋 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

  1. 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 ('|').

  2. 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:

nr_nota
QtdeDev
001
10
002
5
003
7

Após executar a consulta de update recursivo, o campo nr_notadevol na tabela #NotaDevoClbr será atualizado da seguinte forma:

nr_documento
nr_notadevol
12345
`

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.

Data de Publicação: 24-06-2024

Categoria: SQL Server