461

我想更新 SQL Server 中的前 100 条记录。我有一个T1带有字段F1F2. T1有200条记录。我想更新F1前 100 条记录中的字段。如何根据TOP 100SQL Server 进行更新?

4

9 回答 9

766

请注意,UPDATE 语句需要括号:

update top (100) table1 set field1 = 1
于 2009-07-29T06:44:56.150 回答
329

没有一个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'
于 2012-02-11T15:41:09.000 回答
20
update tb set  f1=1 where id in (select top 100 id from tb where f1=0)
于 2009-12-17T06:12:29.407 回答
19

对于像我这样仍然坚持使用 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

于 2013-09-10T20:40:04.873 回答
4

更酷的是,您可以使用内联表值函数来选择要更新的(以及通过多少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语句的语法的真正力量在于。

于 2015-04-23T18:18:31.770 回答
3

您还可以使用别名从选择中更新并加入:

UPDATE  TOP (500) T
SET     T.SomeColumn = 'Value'
FROM    SomeTable T
        INNER JOIN OtherTable O ON O.OtherTableFK = T.SomeTablePK
WHERE   T.SomeOtherColumn = 1
于 2019-05-09T13:55:02.047 回答
1

尝试:

UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo 
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY 
CreatedDate DESC)
于 2018-08-29T11:46:08.940 回答
0

这段代码可以完成它的工作

UPDATE TOP (100) table_name set column_name = value;

如果要显示最后 100 条记录,可以根据需要使用它。

With OrnekWith
as
(
Select Top(100) * from table_name Order By ID desc
)
Update table_name Set column_name = value;
于 2021-01-12T13:23:52.713 回答
0

TOP 限定符也可用于限制手动错误更新的行数。

考虑以下 UPDATE 语法。

UPDATE TOP (1) table1 SET column1 = 0 WHERE column_pk = '123'

如果没有 TOP 子句,如果您正在执行手动更新并且您的鼠标文本选择仅从“UPDATE”选择到“WHERE”子句之前,则更新将应用于所有行。使用 TOP 子句,只有一行会得到不需要的更新。

TOP 约束可以限制缺少或不正确的 WHERE 子句或 ORDER BY 子句的损害。当知道应该只更新一行或几行时,这会很有帮助。

于 2021-07-09T12:22:26.610 回答