Answers:
请注意,括号是UPDATE语句所必需的:
update top (100) table1 set field1 = 1
没有一个ORDER BY
整体的想法是TOP
没有任何意义的。您需要对哪个方向是“向上”和哪个“向下”具有一致的定义,以使顶部的概念有意义。
但是,SQL Server允许这样做,但不能保证确定的结果。
UPDATE TOP
接受的答案中的语法不支持ORDER BY
子句,但可以在此处通过使用CTE或派生表来定义所需的排序顺序,从而获得确定性语义。
;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/zh-cn/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)
order by
?