SQL分页

 

--第一种分页(TOP方式)--

select * from T_Sys_User where User_Id in 

(select top 10 User_Id from T_Sys_User where User_Id not in

(select top (10*0) User_Id from T_Sys_User

order by User_LoginName asc) 

order by User_LoginName asc)

order by User_LoginName asc
View Code

 

--第二种分页(ROW_NUMBER方式)Linq转换后也是用的这种--

select * from (select ROW_NUMBER() over (order by User_LoginName) as row,* from T_Sys_User) as T where T.row between 1 and 10 order by User_LoginName
View Code

 


--第三种分页:CTE方式(common_table_expression,公用表表达式,SQL编写递归--

WITH UserEntity

AS ( SELECT TOP ( 10 * 2 )

ROW_NUMBER() OVER ( ORDER BY User_LoginName DESC ) AS rownum ,

*

FROM T_Sys_User order by User_LoginName

)

SELECT *

FROM UserEntity

WHERE UserEntity.rownum > ( 10 * ( 2 - 1 ) )

ORDER BY UserEntity.User_LoginName
View Code

 

--第四种分页:Fetch(SQL Server 2012及SQL Server 2014)--

SELECT * 

FROM T_Sys_User 

ORDER BY User_LoginName DESC 

OFFSET ( 10 * ( 1 - 1 )) ROWS 

FETCH NEXT 10 ROWS ONLY;
View Code

 

--第五种分页:分页存储过程--

------------------------------------

--用途:支持任意排序的分页存储过程 

--说明:

------------------------------------



CREATE PROCEDURE [dbo].[UP_GetRecordByPageOrder]



@tblName varchar(255),   -- 表名 

@fldName varchar(255),   -- 显示字段名 

@OrderfldName varchar(255), -- 排序字段名 

@StatfldName varchar(255), -- 统计字段名 

@PageSize int = 10,   -- 页尺寸 

@PageIndex int = 1,   -- 页码 

@IsReCount bit = 0,   -- 返回记录总数, 非 0 值则返回 

@OrderType bit = 0,   -- 设置排序类型, 非 0 值则降序 

@strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where) 

AS



declare @strSQL varchar(6000) -- 主语句 

declare @strTmp varchar(100)   -- 临时变量(查询条件过长时可能会出错,可修改100为1000)

declare @strOrder varchar(400) -- 排序类型



if @OrderType != 0 

begin 

set @strTmp = '<(select min' 

set @strOrder = ' order by [' + @OrderfldName +'] desc' 

end 

else 

begin 

set @strTmp = '>(select max' 

set @strOrder = ' order by [' + @OrderfldName +'] asc' 

end



set @strSQL = 'select top ' + str(@PageSize) + ' ' + @fldName + ' from [' 

+ @tblName + '] where [' + @OrderfldName + ']' + @strTmp + '([' 

+ @OrderfldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 

+ @OrderfldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)' 

+ @strOrder



if @strWhere != '' 

set @strSQL = 'select top ' + str(@PageSize) + ' ' + @fldName + ' from [' 

+ @tblName + '] where [' + @OrderfldName + ']' + @strTmp + '([' 

+ @OrderfldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 

+ @OrderfldName + '] from [' + @tblName + '] where ' + @strWhere + ' ' 

+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder



if @PageIndex = 1 

begin 

set @strTmp = '' 

if @strWhere != '' 

set @strTmp = ' where ' + @strWhere



set @strSQL = 'select top ' + str(@PageSize) + ' ' + @fldName + ' from [' 

+ @tblName + ']' + @strTmp + ' ' + @strOrder 

end





if @IsReCount != 0 

set @strSQL = @strSQL+' select count(1) as Total from [' + @tblName + ']'



if @strWhere!=''

set @strSQL = @strSQL+' where ' + @strWhere

exec (@strSQL)



 





------------------------------------

--用途:分页存储过程(对有主键的表效率极高) 

--说明:

------------------------------------



CREATE PROCEDURE [dbo].[UP_GetRecordByPage]

    @tblName      varchar(255),       -- 表名

    @fldName      varchar(255),       -- 主键字段名

    @PageSize     int = 10,           -- 页尺寸

    @PageIndex    int = 1,            -- 页码

    @IsReCount    bit = 0,            -- 返回记录总数, 非 0 值则返回

    @OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序

    @strWhere     varchar(1000) = '' -- 查询条件 (注意: 不要加 where)

AS



declare @strSQL   varchar(6000)       -- 主语句

declare @strTmp   varchar(100)        -- 临时变量(查询条件过长时可能会出错,可修改100为1000)

declare @strOrder varchar(400)        -- 排序类型



if @OrderType != 0

begin

    set @strTmp = '<(select min'

    set @strOrder = ' order by [' + @fldName +'] desc'

end

else

begin

    set @strTmp = '>(select max'

    set @strOrder = ' order by [' + @fldName +'] asc'

end



set @strSQL = 'select top ' + str(@PageSize) + ' * from ['

    + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['

    + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['

    + @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'

    + @strOrder



if @strWhere != ''

    set @strSQL = 'select top ' + str(@PageSize) + ' * from ['

        + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['

        + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['

        + @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '

        + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder



if @PageIndex = 1

begin

    set @strTmp =''

    if @strWhere != ''

        set @strTmp = ' where ' + @strWhere



    set @strSQL = 'select top ' + str(@PageSize) + ' * from ['

        + @tblName + ']' + @strTmp + ' ' + @strOrder

end



if @IsReCount != 0

    set @strSQL = 'select count(*) as Total from [' + @tblName + ']'+' where ' + @strWhere



exec (@strSQL)
View Code

 

你可能感兴趣的:(sql)