接受的答案中的 UPDATE TOP 语法不支持 ORDER BY 子句,但可以通过使用CTE或派生表来定义所需的排序顺序,从而获得确定性语义,如下所示 .
;WITH CTE AS
(
SELECT TOP 100 *
FROM T1
ORDER BY F2
)
UPDATE CTE SET F1='foo'
600
注意,UPDATE语句需要括号:
update top (100) table1 set field1 = 1
0
甚至更酷的是,您可以使用内联表值函数来选择要更新的行(以及多少通过 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
)
6 回答
对于像我这样仍然坚持使用SQL Server 2000的人,可以在
UPDATE
查询之前使用SET ROWCOUNT {number};
将更新限制为100行
至少自SQL 2005以来它已被弃用,但从SQL 2017开始它仍然有效 . https://docs.microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017
没有
ORDER BY
__792817_的整个想法没有多大意义 . 你需要有一个一致的定义,哪个方向是"up",哪个是"down",因为top的概念是有意义的 .尽管如此,SQL Server允许它,但doesn't guarantee a deterministic result .
接受的答案中的
UPDATE TOP
语法不支持ORDER BY
子句,但可以通过使用CTE或派生表来定义所需的排序顺序,从而获得确定性语义,如下所示 .注意,UPDATE语句需要括号:
甚至更酷的是,您可以使用内联表值函数来选择要更新的行(以及多少通过
TOP
)行 . 那是:对于表值函数,您可以选择要更新的行,如下所示:
......(以我的拙见)存在确定性地仅更新顶部选定行的同时简化
UPDATE
语句的语法的真正力量 .尝试: