SQL分页存储过程

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:  Hstar
-- Create date: 2012年6月24日12:23:08
-- Description: 通用分页存储过程
-- Update:2012年8月25日16:26:12(删除了SQL08的语法,让SQL05可用)
-- =============================================
ALTER PROCEDURE [dbo].[Hstar_Paging]
 @tblName varchar(100), --表名
 @fldName varchar(255),--主键字段
 @PageSize INT =20,--分页大小                     
 @PageIndex int,--第几页
 @Columns varchar(1000) = '*',--需要得到的字段
 @OrderType bit = 0,--排序的类型 (0为升序,1为降序)
 @strWhere varchar(1000) = '',--查询条件, 不用加where关键字
 @sortColumn varchar(100) = ''--排序的字段名 (即 order by column asc/desc)

AS
DECLARE @sortTemp varchar(300),@sql varchar(2000)
SET @sortTemp=''
--步骤1、判断是否需要派排序
IF @sortColumn<>''
BEGIN
 IF @orderType=0
 BEGIN
  SET @sortTemp=' order by '+@sortColumn+' asc'
 END
 ELSE
 BEGIN
  SET @sortTemp=' order by '+@sortColumn+' desc'
 END
END     
--步骤二、判断是否是首页,首页直接查询     
IF @PageIndex=1--第一页
BEGIN
 SET @sql='SELECT top '+str(@PageSize)+' '+@Columns+' from '+@tblName+' where '+@strWhere+@sortTemp
END
--步骤三、其他页的查询方法,基于row_number方式
ELSE
BEGIN
 SET @sql='SELECT '+@Columns+' FROM (SELECT no= row_number() OVER '
 IF @sortTemp=''
 BEGIN
  SET @sql=@sql+'(order by '+@fldName+')'
 END
 ELSE
 BEGIN
  SET @sql=@sql+'('+@sortTemp+')'
 END
 SET @sql=@sql+',* FROM '+@tblName+' WHERE '+@strWhere+' )AS tt where tt.no between '+str(@pageSize*(@PageIndex-1)+1)+' and '+str(@PageSize*@PageIndex)
END
exec(@sql)

比较简陋,在此记录下,有空再修改下。

原文地址:https://www.cnblogs.com/humin/p/2656736.html