在哪些情况下,SQL Server行号()不从1开始?

在哪些情况下,SQL Server行号()不从1开始?,sql,sql-server,tsql,analytic-functions,Sql,Sql Server,Tsql,Analytic Functions,我们在查询中使用的是ROW\u NUMBER()。在几乎所有情况下,它都会返回正确的结果。但是对于1个用户来说,它的行为非常不同 With #TEST as ( select top 50 ROW_NUMBER() over (order by a.ID) as RN, a.ID ID, a.Name Name FROM a where a.name like '%test%') select * from #TEST where

我们在查询中使用的是
ROW\u NUMBER()
。在几乎所有情况下,它都会返回正确的结果。但是对于1个用户来说,它的行为非常不同

With #TEST as (
    select top 50 
       ROW_NUMBER() over (order by a.ID) as RN,
       a.ID ID, a.Name Name  
    FROM a 
    where a.name like '%test%')
select * 
from #TEST  
where RN BETWEEN 1 AND 50 
order by RN 
当页面大小设置为50时,此查询对该用户来说运行良好。但是当页面大小设置为100时,我们观察到它并没有返回所有行。它只返回10行。即使有100多个结果满足条件。请查找以下无法正常工作的查询

With #TEST as (
    select top 100 
        ROW_NUMBER() over (order by a.ID) as RN,
        a.ID ID, a.Name Name  
    FROM a 
    where a.name like '%test%')
select * 
from #TEST 
where RN BETWEEN 1 AND 100 
order by RN 
当尝试验证原因时,我们观察到第二个查询返回的RN值大于100。它不是从1开始的

有人能解释这种行为的可能原因吗。SQL Server中的
行编号()
函数值从1开始时,语法中是否有需要修改的内容,或者是否有需要更改的设置?

始终从1开始

返回结果分区内行的序列号 设置,从每个分区中第一行的1开始

您正在执行一个
选择top
,但没有ORDERBY子句。这意味着您无法控制返回的行。您可能会得到使用不同索引获取行的不同执行计划。一个计划中的前100行与另一个计划中的前100行不同。在CTE中的查询中添加一个相关的order by,或者您可以删除top子句,因为您正在筛选主查询中的行。

旁注:我不会将我的CTE命名为以
开头的某个名称。
-该字符表示存储在
TempDB
中的临时表。。。。改名