TOP
和SET ROWCOUNT
之间的效果是否存在差异,或者它们是否以同样的方式执行?
答案 0 :(得分:10)
是的,功能上它们是一回事。据我所知,两者之间没有明显的性能差异。
有一点需要注意的是,一旦你有set rowcount
,这将在连接的生命周期中持续存在,因此请确保在完成连接后将其重置为0
。
<小时/>
SET ROWCOUNT
的范围仅适用于当前程序。这包括当前程序调用的过程。它还包括通过EXEC
或SP_EXECUTESQL
执行的动态SQL,因为它们被视为“子”范围。
请注意,SET ROWCOUNT
位于BEGIN/END
范围内,但超出了此范围。
create proc test1
as
begin
begin
set rowcount 100
end
exec ('select top 101 * from master..spt_values')
end
GO
exec test1
select top 102 * from master..spt_values
结果= 100行,然后是102行
答案 1 :(得分:4)
根据BOL,还有一个关于性能的说明:
作为SELECT语句的一部分,查询优化器可以在查询优化期间考虑TOP或FETCH子句中的表达式值。由于SET ROWCOUNT在执行查询的语句之外使用,因此无法在查询计划中考虑其值。
意味着这些实际上可能存在性能差异。