Ответы:
Обратите внимание, скобки необходимы для операторов 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
тем, что вас интересует, это как "большинство" или "минимум" чего-то. Однако в других случаях вас может заинтересовать только одна подходящая запись. Как я сегодня! Мне нужно было исправить проблемы с данными (циклы) по одному. Весь процесс исправления включал сценарий БД, некоторое вмешательство пользователя и некоторые операции приложения. Нам было все равно, какая запись была обработана первой. Мы просто заботились о том, чтобы обрабатывать их по одному.
WHERE
пункт, чтобы исключить ранее обработанные записи. Вопрос в виде написанного и принятого ответа довольно бессмысленный. Кстати: для использования таблиц в качестве очереди это довольно полезная ссылка
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
а?