Respuestas:
Tenga en cuenta que los paréntesis son obligatorios para las declaraciones de ACTUALIZACIÓN:
update top (100) table1 set field1 = 1
Sin una ORDER BYidea completa TOPno 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 UPDATE TOPsintaxis en la respuesta aceptada no admite una ORDER BYcláusula, pero aquí es posible obtener una semántica determinista 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'
TOPprobabilidades, deberías usarlo ORDER BYporque lo que te interesa es como "lo más" o "menos" de algo. En otros casos, sin embargo, es posible que solo le interese obtener un registro coincidente. ¡Como yo hoy! Necesitaba solucionar problemas de datos (ciclos) uno a la vez. Todo el proceso de reparación involucró un script db, alguna intervención del usuario y algunas operaciones de la aplicación. No nos importó QUÉ registro se manejó primero. Simplemente nos preocupaba que los estuviéramos manejando uno a la vez.
WHEREcláusula para excluir registros procesados previamente. La pregunta como respuesta escrita y aceptada carece de sentido. Por cierto: para usar tablas como una cola, este es un enlace bastante útil
wherecláusula para evitar procesar las mismas filas una y otra vez.
para aquellos como yo que todavía estamos atrapados con SQL Server 2000, SET ROWCOUNT {number};se puede usar antes de la UPDATEconsulta
SET ROWCOUNT 100;
UPDATE Table SET ..;
SET ROWCOUNT 0;
limitará la actualización a 100 filas
Ha quedado en desuso al menos desde SQL 2005, pero a partir de SQL 2017 todavía funciona. https://docs.microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017
Lo que es aún mejor es el hecho de que puede usar una función en línea con valores de tabla para seleccionar qué (y cuántas TOP) filas (s) actualizar. Es decir:
UPDATE MyTable
SET Column1=@Value1
FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3)
Para la función de valor de tabla, 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 solo las primeras filas seleccionadas de manera determinista y al mismo tiempo simplificar la sintaxis de la UPDATEdeclaración.
Tratar:
UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY
CreatedDate DESC)
También puede actualizar desde select usando un alias y unirse:
UPDATE TOP (500) T
SET T.SomeColumn = 'Value'
FROM SomeTable T
INNER JOIN OtherTable O ON O.OtherTableFK = T.SomeTablePK
WHERE T.SomeOtherColumn = 1
order bytambién?