求 存储过程分页
下面这个存储过程不支持任意单个字段排序,可是我想弄个多字段的!!就是弄不出来,哪个高手帮忙看看!alter PROCEDURE GetRecordFromPage
@tblName varchar(500), -- 需要查询的表名
@fldName varchar(50), --主键字段名
@listFldName varchar(255), --需要查询的字段
@orderFldName varchar(50), --需要排序的字段
@orderFldType varchar(50), --需要排序的字段的类型
@PageSize int = 10,
@PageIndex int = 1,
@OrderType bit = 1,
@strWhere varchar(2000) = ''
AS
declare @strSQL nvarchar(4000) -- 主语句
declare @strTmp varchar(1000) -- 临时变量
declare @strOrder varchar(500) -- 排序类型
declare @strOrder2 varchar(500) --
declare @orderFldValue nvarchar(100) --排序字段对应的值
declare @keyFldValue nvarchar(100) --主键字段对应的值 add
declare @operator char(1) --add by caoy
declare @tempValueSql varchar(100)
declare @strOrderby varchar(5)
if (@orderFldType='float')
set @tempValueSql='cast(@orderFldValue as float)'
else
set @tempValueSql='@orderFldValue'
--获取表明 。
declare @tablename varchar(20)
if charindex('.',@orderFldName)>1
set @tablename=left(@orderFldName,charindex('.',@orderFldName)-1)
else
set @tablename=@orderFldName
if @OrderType != 0
begin
set @operator='<'
set @strOrderby=' desc'
set @strOrder2=' asc'
end
else
begin
set @operator='>'
set @strOrderby=' asc'
set @strOrder2=' desc'
end
set @strOrder=' order by '+ @orderFldName+@strOrderby
if @fldName!=@orderFldName --如果排序字段不是主键字段,则增加主键排序
set @strOrder=@strOrder+','+@fldName+@strOrderby
--先得到orderFldValue和keyValue
set @strSQL='select top 1 @orderFldValue=convert(nvarchar(100),'+@orderFldName+',20)' /***注意,如果需要排序的字段的值长度超过Nvarchar(100),请修改此处***********/
if @fldName!=@orderFldName
set @strSQL=@strSQL+',@keyFldValue='+@fldName
else
set @strSQL=@strSQL+',@keyFldValue=1'
set @strSQL=@strSQL+' from (select top ' + str((@PageIndex-1)*@PageSize) + ' '
+ @orderFldName
if @fldName!=@orderFldName --add by caoy
set @strSQL=@strSQL+','+@fldName
set @strSQL=@strSQL+ ' from ' + @tblName + ''
if @strWhere != ''
set @strSQL=@strSQL+ ' where '+@strWhere
set @strSQL=@strSQL+ @strOrder + ') as '+@tablename+' order by ' + @orderFldName +@strOrder2
if @fldName!=@orderFldName --add by caoy
set @strSQL=@strSQL+',' + @fldName +@strOrder2
--print @strSQL
exec sp_executesql @strSQL,N'@orderFldValue nvarchar(100) output,@keyFldValue nvarchar(100) output',@orderFldValue output,@keyFldValue output /***注意,如果需要排序的字段的值长度超过Nvarchar(100),请修改此处***********/
--得到排序字段值和主键值结束
if @PageIndex = 1
begin
set @strTmp = ''
if @strWhere != ''
set @strTmp = ' where (' + @strWhere + ')'
set @strSQL = 'select top ' + str(@PageSize) + ' '+ @listFldName+' from '
+ @tblName + '' + @strTmp + ' ' + @strOrder
exec (@strSQL)
end
else
begin
--取得top数据并返回
set @strSQL = N'select top ' + str(@PageSize) +' ' + @listFldName+' from '
+ @tblName + ' where ('+@orderFldName+@operator+@tempValueSql+' and @keyFldValue=@keyFldValue'
if @fldName!=@orderFldName --add by caoy
set @strSQL=@strSQL+ ' or ('+@orderFldName+'='+@tempValueSql+' and '+@fldName+@operator+'@keyFldValue)) and (1=1'
if @strWhere != ''
set @strSQL=@strSQL+' and ' + @strWhere
set @strSQL=@strSQL+ ')'+@strOrder
if @fldName=@orderFldName
set @keyFldValue=1
--print @strSQL
exec sp_executesql @strSQL,N'@orderFldValue nvarchar(100),@keyFldValue nvarchar(100)',@orderFldValue,@keyFldValue
end
SET QUOTED_IDENTIFIER OFF
GO