Відповіді:
Зауважте, що дужки потрібні для операторів 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
також?