SQL分页存储过程
SQL中的分页存储过程,你懂的...
/****************************************************************************** ** 功能:SQL 分页查询 ** 作者:Danny,Li (xing.dong.li@163.com) ** 日期:2011-11-09 ******************************************************************************* ** 返回值列表 **************************** ** 返回值 涵义 ** ------- ----------------------------------------------------------- ** ******************************************************************************* ** 修订日志 **************************** ** 日期 作者 修订备注 ** ---------- -------- ----------------------------------------------- ** *******************************************************************************/ CREATE PROCEDURE [dbo].[CSP_GetRecordsByPage] @tblName varchar(2000), --表名 @strGetFields varchar(2000)='*', --需要返回的列 @fldName varchar(255)='', --排序的字段名 @PageSize int =10, --页尺寸 @PageIndex int =1, -- 页码 @doCount bit =0, --返回记录总数,非0值则返回 @OrderType bit =0, --设置排序类型,非0值则降序 @strWhere nvarchar(1500)='' --查询条件(注意:不要加where) AS BEGIN DECLARE @strSQL nvarchar(4000) --主语句 DECLARE @strTmp varchar(110) --临时变量 DECLARE @strOrder varchar(400) --排序类型 DECLARE @noDotFldName varchar(255) --如果是多表联合查询则去掉点前面的字符 SET @noDotFldName = SUBSTRING(@fldName,CHARINDEX('.',@fldName)+1,len(@fldName)) --以下代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况 IF @doCount != 0 BEGIN IF @strWhere !='' SET @strSQL = 'SELECT COUNT(*) AS TOTAL FROM ' + @tblName + ' WHERE ' + @strWhere ELSE SET @strSQL = 'SELECT COUNT(*) AS TOTAL FROM ' + @tblName END ELSE BEGIN --如果@OrderType不是0,就执行降序 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 --如果是第一页就执行以下代码,这样会加快执行速度 IF @PageIndex = 1 BEGIN IF @strWhere != '' SET @strSQL = 'SELECT TOP ' + STR(@PageSize) +' ' + @strGetFields + ' FROM ' + @tblName + ' WHERE ' + @strWhere ELSE SET @strSQL = 'SELECT TOP ' + STR(@PageSize) +' ' + @strGetFields + ' FROM '+ @tblName END ELSE BEGIN --以下代码赋予了@strSQL以真正执行的SQL代码 SET @strSQL = 'SELECT TOP ' + STR(@PageSize) + ' ' + @strGetFields + ' FROM ' + @tblName + ' WHERE ' + @fldName + ' ' + @strTmp + '(' + @noDotFldName + ') FROM (SELECT TOP ' + STR((@PageIndex-1)*@PageSize) + ' ' + @fldName + ' FROM ' + @tblName + ' ' + @strOrder + ') AS tblTmp)' IF @strWhere != '' SET @strSQL = 'SELECT TOP ' + STR(@PageSize) + ' ' + @strGetFields+ ' FROM ' + @tblName + ' WHERE ' + @fldName + ' ' + @strTmp + '(' + @noDotFldName + ') FROM (SELECT TOP ' + STR((@PageIndex-1)*@PageSize) + ' ' + @fldName + ' FROM ' + @tblName + ' WHERE ' + @strWhere + ' ' + @strOrder + ') AS TBLTMP) AND ' + @strWhere END IF @strOrder IS NOT NULL AND @strOrder!='' SET @strSQL = @strSQL+' '+@strOrder END PRINT @strSQL EXEC(@strSQL) END