在哪些情况下SQL Server ROW_NUMBER()不是从1开始?

use*_*008 4 sql t-sql sql-server analytic-functions

我们ROW_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 
Run Code Online (Sandbox Code Playgroud)

当页面大小设置为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 
Run Code Online (Sandbox Code Playgroud)

当试图验证原因时,我们发现第二个查询返回的RN值大于100.它不是从1开始.

有人可以解释这种行为的可能原因.语法中是否有任何要修改的内容,或者在SQL Server中是否有任何要更改的设置以使row_number()函数值从1开始?

Mik*_*son 11

row_number始终以1开头.

返回结果集分区中行的序号,从1开始,每个分区的第一行.

你正在做一个select top没有order by子句.这意味着您无法控制返回的行.您可能正在获得使用不同索引来获取行的不同执行计划.一个计划中的前100行与另一个计划中的前100行不同.在CTE中向查询添加相关的顺序,或者您可以删除top子句,因为无论如何您要过滤主查询中的行.