T-SQL是Microsoft SQL Server使用的SQL語言的變體,沒有limit
子句。它有一個select top {...}
修改,你看到的NHibernate趁着與SQL Server 2000
在SQL Server 2005,微軟推出了Row_Number() over (order by {...})
功能,可以作爲一個替代的limit
條款,你可以看到NHibernate的利用與SQL Server 2005/2008相比。
一種SQLite的查詢可能看起來像
select c.[ID], c.[Name]
from [Codes] c
where c.[Key] = 'abcdef'
order by c.[Order]
limit 20 offset 40
而對於SQL Server 2005的一個類似的查詢可能看起來像
select c.[ID], c.[Name]
from (
select c.[ID], c.[Name], c.[Order]
, [!RowNum] = Row_Number() over (order by c.[Order])
from [Codes] c
where c.[Key] = 'abcdef'
) c
where c.[!RowNum] > 40 and c.[!RowNum] <= 60
order by c.[Order]
,或者使用公用表表達式,它可能看起來像
with
[Source] as (
select c.[ID], c.[Name], c.[Order]
, [!RowNum] = Row_Number() over (order by c.[Order])
from [Codes] c
where c.[Key] = 'abcdef'
)
select c.[ID], c.[Name]
from [Source] c
where c.[!RowNum] > 40 and c.[!RowNum] <= 60
order by c.[Order]
還有一種方法可以在SQL Server 2000中執行它以及
select c.[ID], c.[Name]
from (
select top 20 c.[ID], c.[Name], c.[Order]
from (
select top 60 c.[ID], c.[Name], c.[Order]
from [Codes] c
where c.[Key] = 'abcdef'
order by c.[Order]
) c
order by c.[Order] desc
) c
order by c.[Order]
很好的答案@Justice。謝謝你的時間。 – 2009-10-31 15:01:53