Відповіді:
Зауважте, що дужки потрібні для операторів UPDATE:
update top (100) table1 set field1 = 1
Без ORDER BYцілої ідеї TOPне має великого сенсу. Потрібно мати чітке визначення того, який напрямок "вгору" і який "вниз", щоб концепція верху мала значення.
Тим не менш, SQL Server дозволяє це, але не гарантує детермінованого результату .
UPDATE TOPСинтаксис в загальноприйнятому відповіді не підтримує ORDER BYположення , але можна отримати детерміновану семантику тут за допомогою КТРА або похідною таблиці , щоб визначити потрібний порядок сортування , як показано нижче.
;WITH CTE AS
(
SELECT TOP 100 *
FROM T1
ORDER BY F2
)
UPDATE CTE SET F1='foo'
TOPшанси, ви повинні використовувати це, ORDER BYтому що те, що вас цікавить, схоже на "найбільше" або "найменше" чогось. В інших випадках, однак, вас може зацікавити лише одна відповідна запис. Як я сьогодні! Мені потрібно було виправляти проблеми (цикли) по одному. Весь процес виправлення включав сценарій db, деяке втручання користувача та деякі операції із застосуванням. Нас не хвилювало, ЯКІ вперше оброблялися записи. Ми просто дбали про те, щоб ми зверталися з ними по черзі.
WHEREпункт про виключення раніше оброблених записів. Питання як письмова та прийнята відповідь є досить безглуздим. BTW: Для використання таблиць у черзі це досить корисне посилання
whereзастереження, щоб уникнути опрацювання одних і тих же рядків знову і знову.
для тих, як я досі застряг із SQL Server 2000, SET ROWCOUNT {number};можна використовувати перед UPDATEзапитом
SET ROWCOUNT 100;
UPDATE Table SET ..;
SET ROWCOUNT 0;
обмежить оновлення до 100 рядків
Він застарілий принаймні з SQL 2005 року, але станом на SQL 2017 він все ще працює. https://docs.microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017
Що ще крутіше - це той факт, що ви можете використовувати вбудовану функцію з оцінкою таблиці, щоб вибрати, який (і скільки через TOP) рядків (-ів) для оновлення. Це є:
UPDATE MyTable
SET Column1=@Value1
FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3)
Для функції, що оцінюється в таблиці, ви маєте щось цікаве, щоб вибрати рядок для оновлення, наприклад:
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
)
..., і там (на мою скромну думку) криється справжня сила оновлення лише верхньо вибраних рядків детерміновано, одночасно спрощуючи синтаксис UPDATEтвердження.
Спробуйте:
UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY
CreatedDate DESC)
Ви також можете оновити з вибору за допомогою псевдоніму та приєднатися:
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також?