Neste post quero tratar de um assunto problemático que é: update!

Além de ver o update básico utilizando T-SQL, irei mostrar neste post como realizar o MERGE entre tabelas que é uma operação de mesclagem de dados que pode originar, de acordo com a necessidade, as três operações de DML: Insert, Update e Delete.

Então, vamos ver como funciona cada uma delas!

UPDATE

O update é uma operação até que simples e com uma sintaxe fácil de aprender, o grande problema está na forma como ele é realizado e o quão problemático pode se tornar quando ocorre de maneira errada.

Os erros mais comuns na execução de update  se resumem a:

  • Falta do where;
  • Não iniciar a operação com Begin tran

Abaixo, vamos ver como executar update nas colunas de uma tabela modificando o preço de um produto.

Como podemos ver, todos os preços dos produtos passaram a custar 10.00 e uma forma de evitar esse tipo de problema é utilizando update com begin tran. 

Quando realizamos este tipo de operação com begin tran, temos  a opção de executar um rollback (desfaz a operação) ou um commit( que valida a operação), por isso a importância do uso de transações.

NOTA:  após a abertura do begin tran e da ordem de execução, sua transação com seu usuário fica aberta no sistema do banco e ele fica esperando entre o commit ou rollback. CUIDADO, isso pode causar lock na tabela impedindo consultas na mesma.

Veja o exemplo do begin tran abaixo. Se eu executar o commit esta alteração é válida do contrário desfeita.

A linguagem T-SQL possui uma extensão bem interessante que permite realizar update entre tabelas utilizando a cláusula join. Isso pode ser muito útil para atualizar uma nova tabela espelhada em outra garantindo agilidade e integridade.

Isso é permitido porque a cláusula from no update age logicamente como o where, o que facilita a utilização do Join.  

Dito isto, vamos corrigir aquele primeiro primeiro update que realizamos sem o where nem o begin tran. 

Antes de realizar esta operação eu subi um banco novo chamado ‘AdventureWorks 2019_v2’, realizei o update neste banco de ‘teste’ e utilizando o join entre eles, ‘refiz’ aquele update sem where que executamos no primeiro exemplo sobre.

UPDATE UTILIZANDO TABELA DERIVADA

Nesta seção além de aprofundar ainda mais sobre o update, vamos ver como podemos unir a versatilidade das expressões de tabelas junto com esta cláusula.

Por exemplo nesta query, antes de eu realizar o update, fiz um select na query interna para prever qual o valor do produto caso ele seja atualizado aumentando seu valor em 10%

O resultado em vermelho é a query interna executada mostrando uma prévia do resultado final caso fosse atualizado com o update.

Já o resultado em preto é oriundo pós-update.

MERGE

A função de MERGE  tem como função atualizar uma tabela com base em outra tabela utilizando um recurso similar ao join.

Quando vamos realizar esta operação, precisamos de uma tabela base e uma fonte e podemos utilizar dentro do mesmo bloco os três comandos do grupo DML: Insert, update e delete.

Ela possui dois parâmetros bases e um derivado que são:

  • When matched then;
  • When not matched then;
  • When not matched by source then.

Dentro da linguagem T-SQL merge é uma das poucas funções que OBRIGAM o uso de ponto e vírgula no final do bloco de comando.

No exemplo abaixo criei uma nova tabela com as colunas que eu gostaria de atualizar os valores baseados em outra tabela. Como a tabela está vazia e os valores não dão match o update não  é realizado e o comando passa para o bloco do insert.

Ao final, executo um select nesta nova tabela comprovando que os dados foram devidamente inseridos.

A nível de curiosidade, não é possível utilizar select into ou insert select em nenhuma das condições lógicas. Além disso, merge NÃO ACEITA update com a condição lógica when not matched then.

E por último quero apresentar uma forma de usar o update em um pequeno grupo de linhas junto com a cláusula offset – fetch

Imagina que um usuário qualquer queira atualizar uma tabela, porém ele deseja apenas um pequeno conjunto de linhas desta tabela especificando as 50 primeiras. Ele poderia utilizar a cláusula top, porém só as primeiras linhas seriam atualizadas por não poder utilizar order by em  update acarretando uma certa falta de controle nas linhas.

Neste caso podemos utilizar uma outra solução de contorno que une C.T.E a função de offset-fetch. Com isso, podemos ter um maior controle uma vez que utilizamos o order by e temos um filtro mais avançado para manipular os dados das tabelas.

Como vimos, como a query que forma a CTE estava com o filtro de offset conseguimos limitar a ação do update para apenas 30 linhas da coluna o mesmo poderia valer se quiséssemos ignorar as primeiras linhas e atualiza seguintes.

Neste post mostrei formas de se realizar update sendo alguns um pouco mais avançados, além da cláusula merge e como ela funciona. Não esqueçam de abrir o begin tran sempre que for realizar update para não comprometer a base.

Espero que tenham gostado, saúde!

Link para o script!