Quiero actualizar mi columna CODE_DEST con un número incremental. Yo tengo:
CODE_DEST RS_NOM
null qsdf
null sdfqsdfqsdf
null qsdfqsdf
Me gustaría actualizarlo para que sea:
CODE_DEST RS_NOM
1 qsdf
2 sdfqsdfqsdf
3 qsdfqsdf
He probado este código:
UPDATE DESTINATAIRE_TEMP
SET CODE_DEST = TheId
FROM (SELECT Row_Number() OVER (ORDER BY [RS_NOM]) AS TheId FROM DESTINATAIRE_TEMP)
Esto no funciona debido a la )
También he probado:
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
Pero esto tampoco funciona debido a la unión.
¿Cómo puedo actualizar una columna usando la ROW_NUMBER()
función en SQL Server 2008 R2?
sql-server
sql-server-2008-r2
sql-update
user609511
fuente
fuente
UPDATE myCol = myCol+1 FROM MyTable WHERE ID=@MyID
Respuestas:
Una opcion mas
fuente
prueba esto
http://www.mssqltips.com/sqlservertip/1467/populate-a-sql-server-column-with-a-sequential-number-not-using-an-identity/
fuente
SET CODE_DEST = @id, @id = @id + 1
para mejorar la legibilidad.fuente
Su segundo intento falló principalmente porque nombró el CTE igual que la tabla subyacente e hizo que el CTE pareciera un CTE recursivo , porque esencialmente se referenciaba a sí mismo. Un CTE recursivo debe tener una estructura específica que requiera el uso del
UNION ALL
operador de conjunto.En su lugar, podría haberle dado al CTE un nombre diferente y agregarle la columna de destino:
fuente
Esta es una versión modificada de la respuesta de @Aleksandr Fedorenko agregando una cláusula WHERE:
Al agregar una cláusula WHERE, encontré que el rendimiento mejoró enormemente para las actualizaciones posteriores. Sql Server parece actualizar la fila incluso si el valor ya existe y lleva tiempo hacerlo, por lo que agregar la cláusula where hace que se salte las filas donde el valor no ha cambiado. Debo decir que me sorprendió lo rápido que podía ejecutar mi consulta.
Descargo de responsabilidad: no soy un experto en DB y estoy usando PARTITION BY para mi cláusula, por lo que puede que no sean exactamente los mismos resultados para esta consulta. Para mí, la columna en cuestión es el pedido pagado de un cliente, por lo que el valor generalmente no cambia una vez que se establece.
También asegúrese de tener índices, especialmente si tiene una cláusula WHERE en la instrucción SELECT. Un índice filtrado funcionó muy bien para mí, ya que filtraba en función de los estados de pago.
Mi consulta usando PARTICIÓN por
La parte 'IS NOT NULL' no es necesaria si la columna no admite nulos.
Cuando digo que el aumento de rendimiento fue masivo, me refiero a que fue esencialmente instantáneo al actualizar una pequeña cantidad de filas. Con los índices correctos, pude lograr una actualización que tomó la misma cantidad de tiempo que la consulta 'interna' por sí misma:
fuente
Hice esto por mi situación y trabajé
fuente
Manera simple y fácil de actualizar el cursor
fuente
Si la tabla no tiene relación, simplemente copie todo en la nueva tabla con el número de fila y elimine la antigua y cambie el nombre de la nueva por la antigua.
fuente