/* 作者:郭新行 功能:实现数据分页 日期:2004-11-11 描述:此过程功能实现对数据的分页,输入的参数中 @SelectFieldName,@tbName,@strWhere, @OrderFieldName 合起来为一个完整的Select查询语句,此语句中不能包含中间表 @OrderFieldName 必须是可以作为主键的字段 */ ALTER PROCEDURE usp_GetRecordFromPage @tblName varchar(1000), -- 表名 @SelectFieldName varchar(4000), -- 要显示的字段名(不要加select) @strWhere varchar(4000), -- 查询条件(注意: 不要加 where) @OrderFieldName varchar(255), -- 排序索引字段名 @PageSize int , -- 页大小 @PageIndex int = 1, -- 页码 @iRowCount int output, -- 返回记录总数 @OrderType bit = 0 -- 设置排序类型, 非 0 值则降序 AS
DECLARE @strSQL VARCHAR(4000) -- 主语句 DECLARE @strTmp VARCHAR(4000) -- 临时变量 DECLARE @strOrder VARCHAR(1000) -- 排序类型 DECLARE @strRowCount NVARCHAR(4000) -- 用于查询记录总数的语句
SET @OrderFieldName=ltrim(rtrim(@OrderFieldName)) SET @SelectFieldName=ltrim(rtrim(@SelectFieldName)) SET @strWhere =ltrim(rtrim(@strWhere))
IF @SelectFieldName='' BEGIN SET @SelectFieldName=' * ' END
IF @OrderType != 0 BEGIN SET @strTmp = '<(select min' SET @strOrder = ' order by ' + @OrderFieldName +' desc' END ELSE BEGIN SET @strTmp = '>(select max' SET @strOrder = ' order by ' + @OrderFieldName +' asc' END
IF @strWhere != '' BEGIN SET @strSQL = 'select top ' + ltrim(rtrim(str(@PageSize)))+' ' + @SelectFieldName+' from ' + @tblName + ' where ' + @OrderFieldName + @strTmp + '(' + right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (select top ' + ltrim(rtrim(str((@PageIndex-1)*@PageSize)))+' ' + @OrderFieldName + ' from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder END ELSE BEGIN SET @strSQL = 'select top ' + ltrim(rtrim(str(@PageSize)))+' ' + @SelectFieldName+' from ' + @tblName + ' where ' + @OrderFieldName + @strTmp + '(' + right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (select top ' + ltrim(rtrim(str((@PageIndex-1)*@PageSize)))+' ' + @OrderFieldName + ' from ' + @tblName + @strOrder + ') as tblTmp)' + @strOrder END
IF @PageIndex = 1 BEGIN SET @strTmp = '' IF @strWhere != '' BEGIN SET @strTmp = ' where ' + @strWhere END SET @strSQL = 'select top ' + ltrim(rtrim(str(@PageSize)))+ ' ' + @SelectFieldName+' from ' + @tblName + @strTmp + ' ' + @strOrder END
PRINT(@strSQL) EXEC(@strSQL) IF @strWhere!='' BEGIN SET @strRowCount = 'select @iRowCount=count(*) from ' + @tblName+' where '+@strWhere END ELSE BEGIN SET @strRowCount = 'select @iRowCount=count(*) from ' + @tblName END
EXEC sp_executesql @strRowCount,N'@iRowCount int out',@iRowCount out
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <% '分页SQL语句生成代码 Function GetPageSQL(tblName,fldName,PageSize,PageIndex,OrderType,strWhere) Dim strTemp,strSQL,strOrder
'根据排序方式生成相关代码 if OrderType=0 then strTemp=">(select max([" & fldName & "])" strOrder=" order by [" & fldName & "] asc" else strTemp="<(select min([" & fldName & "])" strOrder=" order by [" & fldName & "] desc" end if '若是第1页则无须复杂的语句 if PageIndex=1 then strTemp="" if strWhere<>"" then strTmp = " where " + strWhere end if strSQL = "select top " & PageSize & " * from [" & tblName & "]" & strTmp & strOrder else '若不是第1页,构造SQL语句 strSQL="select top " & PageSize & " * from [" & tblName & "] where [" & fldName & "]" & strTemp & _ " from (select top " & (PageIndex-1)*PageSize & " [" & fldName & "] from [" & tblName & "]" if strWhere<>"" then strSQL=strSQL & " where " & strWhere end if strSQL=strSQL & strOrder & ") as tblTemp)" if strWhere<>"" then strSQL=strSQL & " And " & strWhere end if strSQL=strSQL & strOrder end if GetPageSQL=strSQL '返回SQL语句 End Function response.write(GetPageSQL("message","messageid",10,1,0,"")) %> |