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
)
9条答案
按热度按时间6bc51xsx1#
注意,
UPDATE
语句需要括号:tzdcorbm2#
没有
ORDER BY
,TOP
的整个概念就没有多大意义,你需要有一个一致的定义,哪个方向是“上”,哪个方向是“下”,顶部的概念才有意义。尽管如此,SQL Server只允许doesn't guarantee a deterministic result。
已接受答案中的
UPDATE TOP
语法不支持ORDER BY
子句,但可以通过使用CTE或派生表定义所需的排序顺序来获得确定性语义,如下所示。6pp0gazn3#
6yjfywim4#
对于那些像我一样仍然坚持使用SQL Server 2000的人,可以在
UPDATE
查询之前使用SET ROWCOUNT {number};
将更新限制为100行
至少从SQL 2005开始,它就已被弃用,但截至SQL 2017,它仍然有效。https://learn.microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017
kpbwa7wx5#
更酷的是,您可以使用内联表值函数来选择要更新哪些行(以及通过
TOP
选择要更新多少行)。对于表值函数,您需要选择要更新的行,如下所示:
......,而且(依我的拙见)确定性地只更新顶部选定行,同时简化
UPDATE
语句的语法,这才是真正的强大之处。flmtquvp6#
您还可以使用别名和联接从select进行更新:
cbeh67ev7#
试试看:
pkwftd7m8#
这段代码可以完成它的工作
如果您想显示最后100条记录,可以根据需要使用此选项。
gg58donl9#
TOP限定符也可用于限制手动更新错误的行数。
请考虑以下UPDATE语法。
如果不使用TOP子句,则在执行手动更新时,如果鼠标文本选择仅从“UPDATE”到“WHERE”子句之前,则更新将应用于所有行。如果使用TOP子句,则只有一行将获得不需要的更新。
TOP约束可以限制WHERE子句或ORDER BY子句丢失或不正确所造成的损害。当已知只应更新一行或几行时,这会很有帮助。