求一个分页的存储过程:用GetRecordFromPage按ID排序到是可以。到是我想以时间字段可就麻烦了。。想求一个按任意字段排序的分页存储过程
用GetRecordFromPage按ID排序到是可以。到是我想以时间字段可就麻烦了。
这个是GetRecordFromPage
CREATE PROCEDURE GetRecordFromPage
@tblName varchar(255), -- 表名
@fldName varchar(255), -- 字段名
@allfldName varchar(255), -- 字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@IsCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL varchar(1000) -- 主语句
declare @strTmp varchar(300) -- 临时变量
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) +@allfldName+" 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) +@allfldName+" 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) +@allfldName+" from ["
+ @tblName + "]" + @strTmp + " " + @strOrder
end
exec (@strSQL)
GO
找了个GetPagingData
create PROCEDURE dbo.GetPagingData
(
@tablename varchar(100),--表名或视图表
@fieldlist varchar(4000)='*',--欲选择字段列表
@orderfield varchar(100),--排序字段
@keyfield varchar(100),--主键
@pageindex int,--页号,从0开始
@pagesize int=20,--页尺寸
@strwhere varchar(4000),--条件
@ordertype bit=1--排序,1,降序,0,升序
)
AS
/**//*
名称:GetPagingRecord
作用:按任意字段进行排序分页
作者:菩提树(MARK MA)
时间:2004-12-14
声明:此代码你可以无偿使用及转载,但在转载时,请勿移称本文字声明
*/
SET NOCOUNT ON
declare @sqlstr varchar(6000)
--处理SQL中危险字符,并且将条件处理成易嵌入的形式
set @sqlstr='declare @Rcount int;'
set @sqlstr=@sqlstr+'set @rcount=(select count('+@keyfield+') from '+@tablename+' where '+@strWhere+');'
set @strwhere=replace(@strwhere,'''','''''')
set @strwhere=replace(@strwhere,'--','')
set @strwhere=replace(@strwhere,';','')
set @sqlstr=@sqlstr+'declare @Rnum int;'
set @sqlstr=@sqlstr+'set @rnum=@rcount-'+cast(@pagesize as varchar)+'*'+cast(@pageindex as varchar)+';'
set @sqlstr=@sqlstr+'declare @sqlstr varchar(6000);'
if @ordertype=1
begin
set @sqlstr=@sqlstr+'set @sqlstr=''select top '+cast(@Pagesize as varchar)+' '+@fieldlist+' from (select top 100
percent * from (select top ''+cast(@rnum as varchar)+'' * from '+@tablename+' where '+@strwhere+'
order by '+@orderfield+' asc) as b order by paymoney desc) as a order by '+@orderfield+' desc '';'
end
else
begin
set @sqlstr=@sqlstr+'set @sqlstr=''select top '+cast(@Pagesize as varchar)+' '+@fieldlist+' from (select top 100
percent * from (select top ''+cast(@rnum as varchar)+'' * from '+@tablename+' where '+@strwhere+'
order by '+@orderfield+' desc) as b order by paymoney asc) as a order by '+@orderfield+' asc '';'
end
set @sqlstr=@sqlstr+'if @Rcount>0 begin execute(@sqlstr) end'
--print @sqlstr
execute(@sqlstr)
GO
可是远行:
exec GetPagingData
@tablename ='news',
@fieldlist ='*',--欲选择字段列表
@orderfield ='utter_date',--排序字段
@keyfield ='id',--主键
@pageindex =1,--页号,从0开始
@pagesize =20,--页尺寸
@strwhere ='',--条件
@ordertype =1--排序,1,降序,0,升序
出错提示:
服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: ')' 附近有语法错误。
问题点数:50、回复次数:10Top
1 楼sxBamboo(竹子)回复于 2005-09-28 06:22:55 得分 0
看不懂!这个是ASP.NET的语法吗? —_—!!Top
2 楼luby(轻疯[在岁月无声的消逝里,轻轻的...我疯了。])回复于 2005-09-28 08:10:21 得分 30
这个可以对id和日期同时排序 比如id降序,日期升序等
CREATE PROCEDURE mypage
@tb varchar(50), --表名
@col varchar(50), --按该列来进行分页
@coltype int, --@col列的类型,0-数字类型,1-字符类型,2-日期时间类型
@orderby bit, --排序,0-顺序,1-倒序
@collist varchar(800),--要查询出的字段列表,*表示全部字段
@pagesize int, --每页记录数
@page int, --指定页
@condition varchar(800)--查询条件
AS
DECLARE @sql nvarchar(4000),@where1 varchar(800),@where2 varchar(800)
IF @condition is null or rtrim(@condition)=''
BEGIN--没有查询条件
SET @where1=' WHERE '
SET @where2=' '
END
ELSE
BEGIN--有查询条件
SET @where1=' WHERE ('+@condition+') AND '--本来有条件再加上此条件
SET @where2=' WHERE ('+@condition+') '--原本没有条件而加上此条件
END
IF @page=1--第一页
begin
SET @sql='SELECT TOP '+CAST(@pagesize AS varchar)+' '+@collist+' FROM '+@tb+
@where2+'ORDER BY '+@col+CASE @orderby WHEN 0 THEN '' ELSE ' DESC' END
EXEC(@sql)
return
end
IF @orderby=0
SET @sql='SELECT TOP '+CAST(@pagesize AS varchar)+' '+@collist+
' FROM '+@tb+@where1+@col+'>(SELECT MAX('+@col+') '+
' FROM (SELECT TOP '+CAST(@pagesize*(@page-1) AS varchar)+' '+
@col+' FROM '+@tb+@where2+'ORDER BY '+@col+') t) ORDER BY '+@col
ELSE
SET @sql='SELECT TOP '+CAST(@pagesize AS varchar)+' '+@collist+
' FROM '+@tb+@where1+@col+'<(SELECT MIN('+@col+') '+
' FROM (SELECT TOP '+CAST(@pagesize*(@page-1) AS varchar)+' '+
@col+' FROM '+@tb+@where2+'ORDER BY '+@col+' DESC) t) ORDER BY '+
@col+' DESC'
EXEC(@sql)
returnTop
3 楼520luoxp(一派河山千古秀.NET)回复于 2005-09-28 08:22:19 得分 0
顶Top
4 楼520luoxp(一派河山千古秀.NET)回复于 2005-09-28 10:41:00 得分 0
luby(笑天犬)兄台的存储过程果然是好。
我想实现除了按时间的倒序排序外。还按照ID的倒序排序。
也就是order by utter_date desc,id descTop
5 楼520luoxp(一派河山千古秀.NET)回复于 2005-09-28 14:30:09 得分 0
高分求可实现按任意两个字段的排序的存储过程
我想实现除了按时间的倒序排序外。还按照ID的倒序排序。
也就是order by utter_date desc,id desc
Top
6 楼iuhxq(小灰)回复于 2005-09-28 14:40:16 得分 0
http://blog.csdn.net/iuhxq/archive/2005/06/30/408758.aspx
我写的存储过程Top
7 楼520luoxp(一派河山千古秀.NET)回复于 2005-10-08 08:45:30 得分 0
upTop
8 楼jyk(今天由我来写的代码,明天就让程序自己完成!喜欢编程。和气生财。共同提高。共同进步!)回复于 2005-10-08 08:53:49 得分 20
http://community.csdn.net/Expert/TopicView3.asp?id=4189627
翻动100万级的数据 —— 只需几十毫秒 之解释篇:本来不想再说了,但是有一个误会必须得说一下。
http://community.csdn.net/Expert/TopicView3.asp?id=4182510
翻动100万级的数据 —— 只需几十毫秒 之揭秘篇:有详细的说明,不要错过。
我的两个帖子。
Top
9 楼520luoxp(一派河山千古秀.NET)回复于 2005-10-08 09:20:50 得分 0
jyk 兄我现在想找的是一个:
能按两个字段来排序分页的存储过程。
我想实现除了按时间的倒序排序外。还按照ID的倒序排序。
也就是order by utter_date desc,id desc
Top
10 楼jyk(今天由我来写的代码,明天就让程序自己完成!喜欢编程。和气生财。共同提高。共同进步!)回复于 2005-10-08 10:07:21 得分 0
如果你仔细看的话,你会找到答案的。
http://community.csdn.net/Expert/TopicView3.asp?id=4189627
这里有的Top




