我想更新SQL Server中的前100条记录。我有一个表T1
,其中包含字段F1
和F2
。 T1
有200条记录。我想更新前100条记录中的F1
字段。如何根据SQL Server中的TOP 100
进行更新?
答案 0 :(得分:612)
注意,UPDATE语句需要括号:
update top (100) table1 set field1 = 1
答案 1 :(得分:281)
如果没有ORDER BY
TOP
的整体想法没有多大意义。你需要有一个一致的定义,哪个方向是“向上”,哪个是“向下”,因为top的概念是有意义的。
尽管如此,SQL Server只允许它doesn't guarantee a deterministic result。
接受的答案中的UPDATE TOP
语法不支持ORDER BY
子句,但可以通过使用CTE或派生表来定义所需的排序顺序来获得确定性语义,如下所示。 / p>
;WITH CTE AS
(
SELECT TOP 100 *
FROM T1
ORDER BY F2
)
UPDATE CTE SET F1='foo'
答案 2 :(得分:14)
对于那些像我一样仍然坚持使用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
答案 3 :(得分:12)
update tb set f1=1 where id in (select top 100 id from tb where f1=0)
答案 4 :(得分: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
语句的语法的真正力量。
答案 5 :(得分:0)
尝试:
UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY
CreatedDate DESC)
答案 6 :(得分:0)
您还可以使用别名并加入来从select更新:
UPDATE TOP (500) T
SET T.SomeColumn = 'Value'
FROM SomeTable T
INNER JOIN OtherTable O ON O.OtherTableFK = T.SomeTablePK
WHERE T.SomeOtherColumn = 1
答案 7 :(得分: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;
答案 8 :(得分:0)
TOP 限定符也可以用来限制手动错误更新的行数。
考虑以下 UPDATE 语法。
UPDATE TOP (1) table1 SET column1 = 0 WHERE column_pk = '123'
在没有 TOP 子句的情况下,如果您正在进行手动更新并且您的鼠标文本选择仅从“UPDATE”中选择到“WHERE”子句之前,那么更新将应用于所有行。使用 TOP 子句,只有一行会得到不需要的更新。
TOP 约束可以限制缺少或不正确的 WHERE 子句或 ORDER BY 子句的损害。当已知只应更新一行或几行时,这会很有帮助。