O que eu quero fazer ( eu sei que isso não funciona ) é:
update stats
set BandwidthLastMonth = BandwidthThisMonth,
BandwidthThisMonth=0
where myPk = 3
Existe uma maneira de fazer isso em uma instrução select? Ou preciso escrever um procedimento armazenado e acertar cada registro duas vezes (espero que não).
Minha solução precisa funcionar para Sql Azure e Sql Server 2008.
Até vermos o código real, podemos apenas especular, mas pelo que vale, darei um palpite.
Supondo que seu código envolva apenas uma tabela e suas colunas (sem @variáveis envolvidas) e seja algo como:
É um SQL válido e 100% correto. Correto, ou seja, depois da atualização
column_a
terá os valores quecolumn_b
tinha antes da atualização ecolumn_b
terá0
, para todas as linhas que passarem pelo(condition)
.O SQL-Server segue estritamente esse comportamento e não há razão para presumir que ele se desviará do padrão em uma versão futura.
O SQL funciona em conjuntos e as atualizações são feitas "simultaneamente" em toda a linha. (eles podem não ser feitos simultaneamente, mas o resultado é o mesmo como se fossem.) Você pode alterar o código para este e o resultado será (garantido) o mesmo:
Na verdade, o seguinte também é um SQL válido e equivalente (embora ainda não implementado no SQL-Server);
Não testei o Azure, mas se ele se desviasse desse comportamento SQL básico, seria melhor documentá-lo em algum lugar.