Risposte:
Nota, le parentesi sono richieste per le istruzioni UPDATE:
update top (100) table1 set field1 = 1
Senza ORDER BY
l'idea di TOP
non ha molto senso. Devi avere una definizione coerente di quale direzione è "su" e quale "giù" perché il concetto di cima sia significativo.
Tuttavia SQL Server lo consente ma non garantisce un risultato deterministico .
La UPDATE TOP
sintassi nella risposta accettata non supporta una ORDER BY
clausola, ma è possibile ottenere qui una semantica deterministica utilizzando una tabella CTE o derivata per definire l'ordinamento desiderato come di seguito.
;WITH CTE AS
(
SELECT TOP 100 *
FROM T1
ORDER BY F2
)
UPDATE CTE SET F1='foo'
TOP
probabilità dovresti usarlo ORDER BY
perché quello che ti interessa è come il "più" o il "meno" di qualcosa. In altri casi, tuttavia, potresti essere interessato a ottenere solo un record corrispondente. Come me oggi! Avevo bisogno di risolvere problemi di dati (cicli) uno alla volta. L'intero processo di correzione ha comportato uno script db, alcuni interventi dell'utente e alcune operazioni dell'applicazione. Non ci importava quale record è stato gestito per primo. Ci importava solo che li stessimo gestendo uno alla volta.
WHERE
clausola per escludere i record elaborati in precedenza. La domanda come risposta scritta e accettata è piuttosto insignificante. A proposito: per usare le tabelle come coda questo è un collegamento abbastanza utile
where
clausola per evitare di elaborare ripetutamente le stesse righe.
per quelli come me ancora bloccati con SQL Server 2000, SET ROWCOUNT {number};
possono essere utilizzati prima della UPDATE
query
SET ROWCOUNT 100;
UPDATE Table SET ..;
SET ROWCOUNT 0;
limiterà l'aggiornamento a 100 righe
È stato deprecato almeno da SQL 2005, ma a partire da SQL 2017 funziona ancora. https://docs.microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017
Ciò che è ancora più interessante è il fatto che è possibile utilizzare una funzione con valori di tabella incorporata per selezionare quali (e quante TOP
righe) aggiornare. Questo è:
UPDATE MyTable
SET Column1=@Value1
FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3)
Per la funzione con valori di tabella hai qualcosa di interessante per selezionare la riga da aggiornare come:
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 qui sta (a mio modesto parere) il vero potere di aggiornare deterministicamente solo le prime righe selezionate, semplificando allo stesso tempo la sintassi UPDATE
dell'istruzione.
Provare:
UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY
CreatedDate DESC)
Puoi anche aggiornare da select usando l'alias e unirti:
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
anche questo?