Я работаю на 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 */
возвращается
Id36_0_ Name36_0_
22876 Centro Vacanze Pra delle Torri
22135 Molecaten Park Napoleon Hoeve
Это полностью сбивает меня с толку и приводит к ошибке в нашем приложении, когда я получаю ту же запись Campsite, что и первый элемент на первой и второй странице нашего поиска.
Почему одно и то же предложение ORDER BY работает по-разному внутри выражения ROW_NUMBER OVER()?
__hibernate_sort_row
, и порядок всегда использует этот столбец. - person dotjoe   schedule 02.06.2010