Select * From <SomeTable> Order by <SomeColumn> Offset 10 Rows
-- Declare @tblSample Table ( [Person Name] Varchar(50) ,Age int ,Address Varchar(100) ) -- Insert into @tblSample Select 'Person Name' + CAST(Number AS VARCHAR) , Number ,'Address' + CAST(Number AS VARCHAR) From master..spt_values Where Type = 'p' And Number Between 1 and 50
Select * From @tblSample Order by Age Offset 10 Row
Select * From @tblSample Order by Age Offset (10) Rows
Person Name Age Address Person Name11 11 Address11 Person Name12 12 Address12 . . . . . . . . . . . . . . . . . . . .. . . . . . . . . Person Name49 49 Address49 Person Name50 50 Address50
-- - Declare @RowSkip As int -- Set @RowSkip = 10 -- Select * From @tblSample Order by Age Offset @RowSkip Row
-- 14 50 Select * From @tblSample Order by Age Offset (select MAX(number)/99999999 from master..spt_values) Rows
Select * From @tblSample Order by Age Offset (select dbo.fn_test()) Rows
CREATE FUNCTION fn_test() RETURNS int AS BEGIN Declare @ResultVar as int Select @ResultVar = 10 RETURN @ResultVar END GO
;With Cte As ( Select * From @tblSample Order By Age Offset 10 Rows) Select * From Cte
Select * From (Select * From @tblSample Where Age >10 Order By Age Offset 10 Rows) As PersonDerivedTable
-- view Create View vwPersonRecord AS Select * FROM tblSample GO -- view Select * From vwPersonRecord Where Age > 10 Order By Age Offset 10 Rows
Select * From @tblSample Offset (10) Rows
Select * From @tblSample Order by Age Offset (-10) Rows
Select * From @tblSample Order by Age Offset 10.5 Rows
Select * From @tblSample Order by Age Offset Null Rows
;With Cte As ( Select *, Rn = Row_Number() Over(Order by Age Offset 10 Rows) From @tblSample ) Select * from Cte
Select * From <SomeTable> Order by <SomeColumn> Offset 10 Rows Fetch Next 5 Rows Only; -- Fetch First 5 Rows Only
Select * From @tblSample Order by Age Offset 10 Row Fetch First 5 Rows Only
Person Name Age Address Person Name11 11 Address11 Person Name12 12 Address12 Person Name13 13 Address13 Person Name14 14 Address14 Person Name15 15 Address15
-- Declare @RowSkip As int -- - Declare @RowFetch As int -- - Set @RowSkip = 10 -- - Set @RowFetch = 5 -- 11 15 Select * From @tblSample Order by Age Offset @RowSkip Row Fetch Next @RowFetch Rows Only;
-- Declare @RowSkip As int -- - Declare @RowFetch As int -- Set @RowSkip = 10 Set @RowFetch = 5 ;With Cte As ( Select rn=ROW_NUMBER() Over(Order by (Select 1) /* */ ) ,* From @tblSample ) -- 11 15 Select [Person Name] ,Age ,Address From Cte -- Offset Fetch First/Fetch Next Where rn Between (@RowSkip+1) -- Offset And (@RowSkip+ @RowFetch) -- Fetch First/Fetch Next Clause
Declare @RowSkip As int Declare @RowFetch As int Set @RowSkip = 10 Set @RowFetch = 5 -- , IF OBJECT_ID('tempdb..#Temp') IS NOT NULL BEGIN Drop Table #Temp END -- Create Table #Temp ( Rn int Identity ,[Person Name] Varchar(50) ,Age int ,Address Varchar(100) ) -- Insert Into #Temp([Person Name],Age,Address) Select [Person Name],Age,Address From @tblSample -- 11 15 Select [Person Name] ,Age ,Address From #Temp -- Offset Fetch First/Fetch Next Where Rn Between (@RowSkip+1) -- Offset And (@RowSkip+ @RowFetch) -- Fetch First/Fetch Next
-- tblSample, IF OBJECT_ID('tblSample','U') IS NOT NULL BEGIN DROP TABLE tblSample END GO -- Create Table tblSample ( [Person ID] Int Identity ,[Person Name] Varchar(100) ,Age Int ,DOB Datetime ,Address Varchar(100) ) GO -- Insert into tblSample Select 'Person Name' + CAST(N AS VARCHAR) , N ,DATEADD(D,N, '1900-01-01') ,'Address' + CAST(N AS VARCHAR) From dbo.tsqlc_Tally Where N Between 1 and 1000000 -- Select * From tblSample
-- DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE USE TSQLDB; GO SET STATISTICS IO ON; SET STATISTICS TIME ON; GO -- Declare @RowSkip As int Declare @RowFetch As int -- Set @RowSkip = 20000 Set @RowFetch = 50000 -- , IF OBJECT_ID('tempdb..#Temp') IS NOT NULL BEGIN Drop Table #Temp END -- Create Table #Temp ( Rn int Identity ,[Person ID] int ,[Person Name] Varchar(50) ,Age int ,DOB datetime ,Address Varchar(100) ) -- Insert Into #Temp([Person ID],[Person Name],Age,DOB,Address) Select [Person ID],[Person Name],Age,DOB,Address From dbo.tblSample -- 20 000 70 000 Select [Person ID] ,[Person Name] ,Age ,DOB ,Address From #Temp -- Offset Fetch First/Fetch Next Where Rn Between (@RowSkip+1) -- Offset And (@RowSkip+ @RowFetch) -- Fetch First/Fetch Next GO SET STATISTICS IO OFF; SET STATISTICS TIME OFF; GO
DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE USE TSQLDB; GO SET STATISTICS IO ON; SET STATISTICS TIME ON; GO Declare @RowSkip As int Declare @RowFetch As int Set @RowSkip = 20000 Set @RowFetch = 50000 ;With Cte As ( Select rn=ROW_NUMBER() Over(Order by (Select 1)) ,* From dbo.tblSample ) Select [Person ID] ,[Person Name] ,Age ,DOB ,Address From Cte Where rn Between (@RowSkip+1) <em> </em> And (@RowSkip+ @RowFetch) GO SET STATISTICS IO OFF; SET STATISTICS TIME OFF; GO
DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE USE TSQLDB; GO SET STATISTICS IO ON; SET STATISTICS TIME ON; GO Declare @RowSkip As int Declare @RowFetch As int Set @RowSkip = 20000 Set @RowFetch = 50000 Select * From dbo.tblSample Order by (Select 1) Offset @RowSkip Row Fetch Next @RowFetch Rows Only; GO SET STATISTICS IO OFF; SET STATISTICS TIME OFF; GO
Sql Server Version | CPU Time | Elapsed time |
2000 | 110ms | 839 ms |
2005/2008 | 78ms | 631 ms |
2011 | 46ms | 626 ms |
Select Top(10) [Person ID] ,[Person Name] ,Age ,DOB ,Address From dbo.tblSample Order By Age Desc
Select [Person ID] ,[Person Name] ,Age ,DOB ,Address From dbo.tblSample Order By Age Desc Offset 10 Rows
Source: https://habr.com/ru/post/123491/
All Articles