while tabla recorrer sql sql-server sql-update

while - recorrer tabla sql server cursor



¿Cómo puedo actualizar los 100 registros principales en el servidor SQL? (6)

ACTUALIZACIÓN Dispatch_Post SET isSync = 1 WHERE ChallanNo IN (SELECCIONAR TOP 1000 ChallanNo DESDE dbo.Dispatch_Post ORDEN POR CreatedDate DESC)

Quiero actualizar los primeros 100 registros en SQL Server. Tengo una tabla T1 con campos F1 y F2 . T1 tiene 200 registros. Quiero actualizar el campo F1 en los primeros 100 registros. ¿Cómo puedo actualizar basado en TOP 100 en SQL Server?


Lo que es aún más interesante es el hecho de que puede usar una función de valores de tabla en línea para seleccionar qué fila (s) mediante TOP (s) para actualizar. Es decir:

UPDATE MyTable SET Column1=@Value1 FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3)

Para la función de tabla de valores, tiene algo interesante para seleccionar la fila para actualizar como:

CREATE FUNCTION tvfSelectLatestRowOfMyTableMatchingCriteria ( @Param1 INT, @Param2 INT, @Param3 INT ) RETURNS TABLE AS RETURN ( SELECT TOP(1) MyTable.* FROM MyTable JOIN MyOtherTable ON ... JOIN WhoKnowsWhatElse ON ... WHERE MyTable.SomeColumn=@Param1 AND ... ORDER BY MyTable.SomeDate DESC )

..., y ahí radica (en mi humilde opinión) el verdadero poder de actualizar de forma determinista solo las filas superiores seleccionadas al mismo tiempo que simplifica la sintaxis de la instrucción UPDATE .


Sin una ORDER BY TOP idea completa de TOP no tiene mucho sentido. Debe tener una definición coherente de qué dirección está "arriba" y cuál está "abajo" para que el concepto de arriba sea significativo.

No obstante, SQL Server lo permite pero no garantiza un resultado determinista .

La sintaxis de UPDATE TOP en la respuesta aceptada no admite una cláusula ORDER BY pero es posible obtener una semántica determinista aquí utilizando un CTE o una tabla derivada para definir el orden de clasificación deseado como se muestra a continuación.

;WITH CTE AS ( SELECT TOP 100 * FROM T1 ORDER BY F2 ) UPDATE CTE SET F1=''foo''


Tenga en cuenta, los paréntesis son necesarios para las declaraciones UPDATE:

update top (100) table1 set field1 = 1



update tb set f1=1 where id in (select top 100 id from tb where f1=0)