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 BY
idea completa 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 UPDATE TOP
sintaxis en la respuesta aceptada no admite una ORDER BY
clá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'
TOP
probabilidades, deberías usarlo ORDER BY
porque 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.
WHERE
clá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
where
clá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 UPDATE
consulta
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 UPDATE
declaració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 by
también?