Quero atualizar minha coluna CODE_DEST com um número incremental. Eu tenho:
CODE_DEST RS_NOM
null qsdf
null sdfqsdfqsdf
null qsdfqsdf
Eu gostaria de atualizá-lo para ser:
CODE_DEST RS_NOM
1 qsdf
2 sdfqsdfqsdf
3 qsdfqsdf
Eu tentei este código:
UPDATE DESTINATAIRE_TEMP
SET CODE_DEST = TheId
FROM (SELECT Row_Number() OVER (ORDER BY [RS_NOM]) AS TheId FROM DESTINATAIRE_TEMP)
Isso não funciona por causa do )
Eu também tentei:
WITH DESTINATAIRE_TEMP AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY [RS_NOM] DESC) AS RN
FROM DESTINATAIRE_TEMP
)
UPDATE DESTINATAIRE_TEMP SET CODE_DEST=RN
Mas isso também não funciona por causa da união.
Como posso atualizar uma coluna usando a ROW_NUMBER()
função no SQL Server 2008 R2?
sql-server
sql-server-2008-r2
sql-update
user609511
fonte
fonte
UPDATE myCol = myCol+1 FROM MyTable WHERE ID=@MyID
Respostas:
Mais uma opção
fonte
tente isso
http://www.mssqltips.com/sqlservertip/1467/populate-a-sql-server-column-with-a-sequential-number-not-using-an-identity/
fonte
SET CODE_DEST = @id, @id = @id + 1
para facilitar a leitura.fonte
Sua segunda tentativa falhou principalmente porque você nomeou a CTE igual à tabela subjacente e fez a CTE parecer uma CTE recursiva , porque essencialmente se referia a si mesma. Um CTE recursivo deve ter uma estrutura específica que requer o uso do
UNION ALL
operador de conjunto.Em vez disso, você poderia simplesmente dar ao CTE um nome diferente, bem como adicionar a coluna de destino a ele:
fonte
Esta é uma versão modificada da resposta de @Aleksandr Fedorenko adicionando uma cláusula WHERE:
Ao adicionar uma cláusula WHERE, descobri que o desempenho melhorou enormemente para as atualizações subsequentes. O Sql Server parece atualizar a linha, mesmo se o valor já existir e levar tempo para fazer isso, portanto, adicionar a cláusula where faz com que ele simplesmente pule as linhas onde o valor não mudou. Devo dizer que fiquei surpreso com a rapidez com que ele executou minha consulta.
Isenção de responsabilidade: não sou nenhum especialista em DB e estou usando PARTITION BY para minha cláusula, portanto, pode não ser exatamente o mesmo resultado para esta consulta. Para mim, a coluna em questão é um pedido pago do cliente, então o valor geralmente não muda depois de definido.
Além disso, certifique-se de ter índices, especialmente se tiver uma cláusula WHERE na instrução SELECT. Um índice filtrado funcionou muito bem para mim, pois estava filtrando com base nos status de pagamento.
Minha consulta usando PARTITION por
A parte 'IS NOT NULL' não é necessária se a coluna não puder ser anulada.
Quando digo que o aumento de desempenho foi enorme, quero dizer que foi essencialmente instantâneo ao atualizar um pequeno número de linhas. Com os índices corretos, consegui obter uma atualização que demorou o mesmo tempo que a consulta "interna" sozinha:
fonte
Eu fiz isso para a minha situação e trabalhei
fonte
Maneira simples e fácil de atualizar o cursor
fonte
Se a tabela não tiver relação, apenas copie tudo na nova tabela com o número da linha e remova a antiga e renomeie a nova com a antiga.
fonte