MULTIPLOS UPDATES EM UMA ÚNICA COLUNA
Este exemplo utiliza o banco de dados pubs para ajustar o preço de venda dos livros por diferentes valores, de acordo com diferentes critérios. Neste exemplo, iremos abater 25% do preço para todos os livros de qualquer editor que estejam relacionados a negócios, e 10% para todos os outros livros de um editor em particular. Para que isto seja executado, é necessário embutir duas sentenças de UPDATE dentro de uma mesma transação, conforme segue:
BEGIN TRAN
UPDATE titles SET …
UPDATE titles SET …
COMMIT tran
A desvantagem desta técnica é que a tabela será lida duas vezes, uma vez para cada UPDATE. Se este código for reescrito, conforme o exemplo abaixo, então a tabela será lida apenas uma vez. Para grandes tabelas, isto irá diminiur a significativamente a ocorrência de Disk I/O.
UPDATE titles
SET price =
CASE
WHEN type = “business”
THEN price * 0.75
WHEN pub_id = “0736”
THEN price * 0.9
END
WHERE pub_id = “0736” OR type = “business”
Observe que é definida uma prioridade de execução (top-down) envolvendo a sentença CASE. Para livros de negócios do editor 0736, o desconto será aplicado porque esta é a primeira condição da lista ordenada.
UPDATE EM MULTIPLAS COLUNAS
É possível utilizar a sentença CASE para alterar multiplas colunas em uma tabela, mesmo utilizando critérios separados de alteração para cada coluna. Este exemplo altera a tabela publishers para ajustar o valor da coluna state para “–” para todas as companias que não são americanas e alterar a cidade para um editor em particular, tudo em uma única operação de leitura.
UPDATE publishers
SET state =
CASE
WHEN country <> “USA”
THEN “–“
ELSE state
END,
city =
CASE
WHEN pub_id = “9999”
THEN “LYON”
ELSE city
END
WHERE country <> “USA” OR
pub_id = “9999”
Duas coisas são particularmente importantes de ser lembradas neste exemplo:
– A cláusula ELSE [column] é requerida para cada Sentença CASE utilizada;
– A cláusula WHERE no final deve ser utilizada para restringir o UPDATE a linhas que precisem de pelo menos uma coluna para atualizar, caso contrário, todas as colunas da tabela serão atualizadas, aumentando tanto o tempo de execução quanto a utilização do log de transação.
Para saber mais sobre a sentença CASE, consulte o BOL do SQL Server 2000.

