我怎样才能更新SQL Server中的前100名logging

我想更新SQL Server中的前100个logging。 我有一个表T1与领域F1F2T1有200条logging。 我想更新前100个logging中的F1字段。 我如何在SQL Server中基于TOP 100进行更新?

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

 update top (100) table1 set field1 = 1 

没有ORDER BY TOP的整个想法没有太大的意义。 你需要有一个一致的定义,哪个方向是“上”,哪个方向是“下”,顶层的概念是有意义的。

尽pipe如此,SQL Server允许它,但不保证确定性的结果 。

已接受的答案中的UPDATE TOP语法不支持ORDER BY子句,但可以通过使用CTE或派生表来定义所需的sorting顺序,如下所示,从而获得确定性语义。

 ;WITH CTE AS ( SELECT TOP 100 * FROM T1 ORDER BY F2 ) UPDATE CTE SET F1='foo' 

对于像我这样的人仍然坚持使用SQL Server 2000, SET ROWCOUNT {number}; 可以在UPDATE查询之前使用

 SET ROWCOUNT 100; UPDATE Table SET ..; SET ROWCOUNT 0; 

将限制更新为100行

至less从SQL 2005开始,它已经被弃用了,但从SQL 2012开始它仍然有效。 编辑:它在SQL 2014中被杀害。 使用SET ROWCOUNT不会影响SQL Server 2014及更高版本中的DELETE,INSERT和UPDATE语句。

 update tb set f1=1 where id in (select top 100 id from tb where f1=0) 

更酷的是,您可以使用内联表值函数来select要更新的行(和多less个通过TOP )行。 那是:

 UPDATE MyTable SET Column1=@Value1 FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3) 

对于表值函数,您可以select要更新的行,如下所示:

 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语句的语法。