Я нахожусь на SQL Server 2008, использую NHibernate в качестве постоянного уровня (хотя я думаю, что это чисто SQL).
Я свел мою проблему к следующему оператору SQL:
SELECT TOP 2
this_.Id as Id36_0_,
this_.Name as Name36_0_,
ROW_NUMBER() OVER (ORDER BY this_.IsActive) as MyOrder
FROM Campsites this_
ORDER BY this_.IsActive /* a bit field */
Это часть запроса, который NH генерирует для извлечения постраничного набора результатов. Приведенное выше утверждение дает мне следующий результат:
Id36_0_ Name36_0_ MyOrder
9806 Camping A Cassagnau 1
8869 Camping a la ferme La Bergamotte 2
Однако, если я опускаю ROW_NUMBER () OVER (ORDER BY this_.IsActive) - который генерирует NH для получения результатов на первой странице - я получаю две совершенно разные записи в таблице:
SELECT TOP 2
this_.Id as Id36_0_,
this_.Name as Name36_0_
/* ROW_NUMBER() OVER(ORDER BY this_.IsActive) as MyOrder */
FROM Campsites this_
ORDER BY this_.IsActive /* a bit field */
1012 * возвращается *
Id36_0_ Name36_0_
22876 Centro Vacanze Pra delle Torri
22135 Molecaten Park Napoleon Hoeve
Это полностью смущает меня и приводит к ошибке в нашем приложении, когда я получаю ту же запись в лагере, что и первый элемент на первой И второй странице нашего поиска.
Почему одно и то же предложение ORDER BY работает по-разному в выражении ROW_NUMBER OVER ()?