Respostas:
Observe que os parênteses são necessários para as instruções UPDATE:
update top (100) table1 set field1 = 1
Sem uma ORDER BY
idéia toda TOP
, não faz muito sentido. Você precisa ter uma definição consistente de qual direção é "para cima" e qual é "para baixo" para que o conceito de topo seja significativo.
No entanto, o SQL Server permite, mas não garante um resultado determinístico .
A UPDATE TOP
sintaxe na resposta aceita não suporta uma ORDER BY
cláusula, mas é possível obter semântica determinística aqui usando uma CTE ou tabela derivada para definir a ordem de classificação desejada, conforme abaixo.
;WITH CTE AS
(
SELECT TOP 100 *
FROM T1
ORDER BY F2
)
UPDATE CTE SET F1='foo'
TOP
probabilidades, deve usá-las ORDER BY
porque o que mais lhe interessa é o "mais" ou o "menos" de alguma coisa. Em outros casos, no entanto, você pode estar interessado apenas em obter um registro correspondente. Como eu hoje! Eu precisava corrigir problemas de dados (ciclos) um de cada vez. Todo o processo de correção envolveu um script db, alguma intervenção do usuário e algumas operações do aplicativo. Não nos importamos com qual disco foi tratado primeiro. Nós apenas nos importávamos que estávamos lidando com eles, um de cada vez.
WHERE
cláusula para excluir registros processados anteriormente. A pergunta como resposta escrita e aceita não tem sentido. BTW: Para o uso de tabelas como uma fila isso é bastante um link útil
where
cláusula para evitar o processamento das mesmas linhas repetidas vezes.
para aqueles como eu ainda presos no SQL Server 2000, SET ROWCOUNT {number};
podem ser usados antes da UPDATE
consulta
SET ROWCOUNT 100;
UPDATE Table SET ..;
SET ROWCOUNT 0;
limitará a atualização a 100 linhas
Ele foi preterido pelo menos desde o SQL 2005, mas a partir do SQL 2017 ainda funciona. https://docs.microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017
O que é ainda mais interessante é o fato de que você pode usar uma função com valor de tabela embutida para selecionar quais (e quantas via TOP
) linha (s) a atualizar. Isso é:
UPDATE MyTable
SET Column1=@Value1
FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3)
Para a função com valor de tabela, você tem algo interessante para selecionar a linha a ser atualizada, 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
)
... e aí reside (na minha humilde opinião) o verdadeiro poder de atualizar apenas as principais linhas selecionadas de maneira determinística e ao mesmo tempo simplificar a sintaxe da UPDATE
declaração.
Tentar:
UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY
CreatedDate DESC)
Você também pode atualizar de select usando alias e ingressar em:
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
também?