我怎样才能更新SQL Server中的前100名logging
我想更新SQL Server中的前100个logging。 我有一个表T1
与领域F1
和F2
。 T1
有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
语句的语法。