首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求sql2000分页储存语句,要求不是按ID(主键)来排序,而是按其他多列排序,并有允许列有重复值

2012-12-16 
求sql2000分页存储语句,要求不是按ID(主键)来排序,而是按其他多列排序,并有允许列有重复值求sql2000分页存

求sql2000分页存储语句,要求不是按ID(主键)来排序,而是按其他多列排序,并有允许列有重复值
求sql2000分页存储语句,要求不是按ID(主键)来排序,而是按其他多列排序,并有允许列有重复值
比如:表中列名 id(主键)  title   money1  money2 要求按money1 desc,money2 desc,排序,其中当money1值相同时,按money2排。asp网站
网上找到几个分页排序好象都是要求列中只有唯一值才可以,当money1值相同时,分页出错,无法显示。

[最优解释]
用临时表.
传入页数@page,以每页30条为例.
select i=identity(int,1,1),id,title,money1,money2 into # from tb order by money1 desc,money2 desc
select top 30 * from # where i>@page*30 order by i
[其他解释]
修正:
用临时表.
传入页数@page,以每页30条为例.
select i=identity(int,1,1),id,title,money1,money2 into # from tb order by money1 desc,money2 desc
select top 30 * from # where i>(@page-1)*30 order by i 
[其他解释]
我要求的是大量存储,200W条数据以上
[其他解释]
不用ID列排序,就必须对全表进行处理,否则无法获得序列.而无论是2000或是以上版本,全表处理时用临时表总是速度最快的.
如果一定要不处理所有数据,则,另外创建一个表,这个表中存放着用money1,money2排序后的ID列值,且有一个序号列.每插入一行数据,就要重新整理一次这个表,如果你的表不是经常插入数据,则用这种方式比较好,相当于自己增加一个表外的聚集索引.
[其他解释]
谢谢楼上,我对sql2000存储过程不是很熟,能不能写个象其它分页程序的存储过程,让我在sql2000中建个存储过程,然后直接asp文件中引用一下,就象http://bbs.csdn.net/topics/390292915 那样。

[其他解释]
把上面的语句组织一下吧.
create procedure getpage
@page int,  --当前页
@pagenum int --每页行数
as
begin
select i=identity(int,1,1),id,title,money1,money2 into # from tb order by money1 desc,money2 desc
select top (@pagenum) * from # where i>(@page-1)*@pagenuum order by 
end
[其他解释]
谢谢,楼主真是好人,我原来的asp程序具体引用如下:楼主能不能写入完整的存储过程给我,我会表示谢意的。
dim totalPut   '总记录
   dim CurrentPage  '当前页次
   dim TotalPages   '总页数

if b<>"" then
strwhere=strwhere&"and bigclassid="&b&" "
end if

if s<>"" then
strwhere=strwhere&" and smallclassid ="&s&"  "


Dim DL_CMD
Set DL_CMD=Server.CreateObject("ADODB.Command")
With DL_CMD
.ActiveConnection=conn 
.CommandType = 4 
.CommandText="P_viewPage"
.Prepared = true              '要求将SQL命令先行编译


.Parameters.Append .CreateParameter("@TblName", 200, 1, 255, "maindata")'查询表设置
.Parameters.Append .CreateParameter("@StrGetFields", 200, 1, 1000, "*")'查询列设置
.Parameters.Append .CreateParameter("@FldName",200,1,255,"elite")'排序列设置
.Parameters.Append .CreateParameter("@FldName2",200,1,255,"groupid")'排序列设置
.Parameters.Append .CreateParameter("@FldName3",200,1,255,"timefororder")'排序列设置
.Parameters.Append .CreateParameter("@PageSize", 3, 1, 4, MaxPerPage)'每页条数
.Parameters.Append .CreateParameter("@PageIndex", 3, 1,4 , CurrentPage)'页码数
.Parameters.Append .CreateParameter("@doCount", 3, 1,4 , 1)'1返回记录数 0返回记录集


.Parameters.Append .CreateParameter("@OrderType", 3, 1,4 , 1)'0正序排列 1 倒序排列
.Parameters.Append .CreateParameter("@StrWhere", 200, 1, 1500,strwhere)'查询条件设置
End With

Set rsNum=DL_CMD.Execute()
totalPut=rsNum(0)
rsNum.Close()
下面是分页语句
<%  
dim n,k 
if (totalPut mod MaxPerPage)=0 then  '总记录数与每页最大记录数求余的结果为零时,则N返回整数页次,否则再加一.
n= totalPut \ MaxPerPage
else  
n= totalPut \ MaxPerPage + 1  
end If

call fenyei()
response.write"共"&totalPut&"条"
sub fenyei()
'分页显示代码块 可独立使用,注意和上面分页功能代码配使用
k=currentPage
if k<>1 then
response.write "<a href='?b="&b&"&s="&s&"&page=1'>1...</a>"
response.write "<a href='?b="&b&"&s="&s&"&page="&cstr(k-1)&"'>上一页</a>"
end if

If k <10 Then
        StartNum = 1
        Else
        StartNum = k-5
        End if
        EndNum = StartNum+9
        If EndNum > n Then
        EndNum = n
        End if
   for a=StartNum to EndNum
        if a=k then
        response.write "<span>"&a&"</span>"
        else
        response.write "<a href='?b="&b&"&s="&s&"&page="&cstr(a)&"'>"&a&"</a>"
end if
next

if k<>n then
response.write "<a href='?b="&b&"&s="&s&"&page="&cstr(k+1)&"'>下一页</a>"
response.write "<a href='?b="&b&"&s="&s&"&page="&cstr(n)&"'>..."&cstr(n)&"</a>"
end if
end sub

%>

[其他解释]
通用程序,是效率最差的程序.
我上面写的,就是按你的要求查询指定页记录的分页程序,如果你要查别的表,那改一下表名,如果你还要查别的列,那添加一下列名,仅此而已.
[其他解释]
我要调用查出来的总数,
Set rsNum=DL_CMD.Execute()
totalPut=rsNum(0)
rsNum.Close()
才能用于下面的分页,这怎么写
dim n,k 
if (totalPut mod MaxPerPage)=0 then  '总记录数与每页最大记录数求余的结果为零时,则N返回整数页次,否则再加一.
n= totalPut \ MaxPerPage
else  
n= totalPut \ MaxPerPage + 1  
end If

call fenyei()
response.write"共"&totalPut&"条"
sub fenyei()

[其他解释]
可以加一个输出参数存放总行数.
create procedure getpage
@page int,  --当前页
@pagenum int, --每页行数
@rowcount int output
as
begin
select i=identity(int,1,1),id,title,money1,money2 into # from tb order by money1 desc,money2 desc
set @rowcount=@@identity
select top (@pagenum) * from # where i>(@page-1)*@pagenuum order by 


end 
[其他解释]
谢谢你,我根据你写的,再重新整理一下,如不行再请教你
[其他解释]
不谢    !
[其他解释]
你好我根据你写的整理一下,建存储的时候指示错误,order附近有错,16行有误,不知错在哪
create procedure getpage

@tblName varchar(255), -- 表名

@strGetFields varchar(1000) = '*', -- 需要返回的列

@fldName varchar(255)='', -- 排序的字段名

@fldName2 varchar(255)='', -- 排序的字段名2

@fldName3 varchar(255)='', -- 排序的字段名3

@PageSize int = 20, -- 页尺寸

@PageIndex int = 1, -- 页码

@strWhere varchar(1500) = '', -- 查询条件 (注意: 不要加 where)

@rowcount int output 

AS

declare @strSQL varchar(5000) -- 主语句

begin

select i=identity(int,1,1),'+@strGetFields+ ' into # from [' + @tblName + '] where ' + @strWhere + ' order by [' + @fldName +'] desc,[' + @fldName2 +'] desc,[' + @fldName3 +'] desc

set @rowcount=@@identity

select top (@PageSize) * from # where i>(@PageIndex-1)*@PageSize order by 

end 

exec (@strSQL)

GO

[其他解释]
行不通的.
用了临时表,不能直接用动态语句.一定要用的话,得用SP_EXECUTESQL.
为什么要把表,字段,条件,排序什么的都用变量来处理呢?前面不是说了啊,通用的,就是效率最差的,反正又不差地方,一个分页查询写一个存储过程不行吗?
[其他解释]
提示where ' + @strWhere + ' order by  有错,
16行:select top (@PageSize) * from # where i>(@PageIndex-1)*@PageSize order by 有误
[其他解释]
编程,要将复杂问题简单化,而不要将简单问题复杂化,我们在干什么,在实现需求,只要能达到目的,为什么要自己和自己过不去呢!
[其他解释]
你这儿不单单是语法错误的问题.
由动态查询所获得的临时表,是在另一个会话中,当前会话调用不到它.所以即使语法不错,仍然会有"找不到表#"的错误.
[其他解释]
但查询条件肯定是变量的,因为大类下,还有小类的排序。' + @strWhere + ' 
[其他解释]
如果仅是查询条件变化,那可以将条件值以变量的形式传进存储过程,而不要把条件语句传进存储过程.
[其他解释]
因为我类别是用数字表示的,比如:1下有2类别 3类别,那怎么办
[其他解释]
因为我不太懂sql复杂语句,所以刚才说能不能写个完整的存储给我。
[其他解释]
而且,用动态语句的话,存储过程不能事先编译,效率亦会大大降低.
[其他解释]
create procedure getpage
@page int,  --当前页
@pagenum int, --每页行数
@where1 int,  --下面三个是查询条件
@where2 varchar(10),
@where3 int,
@rowcount int output
as
begin
select i=identity(int,1,1),id,title,money1,money2 into # from tb
where column1=@where1 and column2=@where2 and column3=@where3
order by money1 desc,money2 desc
set @rowcount=@@identity


select top (@pagenum) * from # where i>(@page-1)*@pagenuum order by 
end  
[其他解释]
简单地说,比如有5个大类,每个大类下有2个小类,打开大类内容按列elite排序,再打开其中的小类,也按elite排序,elite值有的有相同,编sql分页存储,有办法实现吗
[其他解释]
我要睡了.
总之,把变量传到存储过程里,直接将字段与变量值进行比较,而不要将查询语句的片断作为字符传到存储过程中去拼语句.其实排序也一样,可以采用:
order by (case when @order=1 then column1 else column2 end) 之类地来实现
关键是,你的表,你查询的字段,都是已知的!
[其他解释]
我找了现有网上的sql分类存储,试了好多,但一遇到elite值相同的,分页全部出问题。没有相同的都正常,所以一直被这个问题困扰很久,无法解决,出现相同值分页问题
[其他解释]
相同不要紧,因为我给你的解决方案中,已经另外生成了唯一序号i,只要排序正确,就不会有什么问题.
[其他解释]
谢谢,我再试试
[其他解释]
select top (@pagenum) * from # where i>(@page-1)*@pagenuum order by 
把 @pagenum 改成直接的数字,比如一页20条,那就用20.
可能是 2000 不支持 top (@num)
[其他解释]
select top (@pagenum) * from # where i>(@page-1)*@pagenuum order by 
报这一行有误,无法建
[其他解释]
最后那个 end   附近语法有误  

[其他解释]
谢谢你,耐心的帮助。
[其他解释]
如果在后面加 i
出现两个问题,因为大类时 where2 不存在,提示where2没有值,
where2加入值后,提示
Microsoft OLE DB Provider for SQL Server 错误 '80040e14' 

无法使用 SELECT INTO 语句向表 '#' 中添加标识列,该表中已有继承了标识属性的列 'id'。 
[其他解释]
我已经按你讲的,全部改为直接数字传递,当按大类时,出现
Microsoft OLE DB Provider for SQL Server 错误 '80040e10' 

过程 'getpage' 需要参数 '@where2',但未提供该参数。 

/zs/zs.asp,行 251 

按小类时出现
Microsoft OLE DB Provider for SQL Server 错误 '80040e14' 

无法使用 SELECT INTO 语句向表 '#' 中添加标识列,该表中已有继承了标识属性的列 'id'。  
[其他解释]
select top 20 * from # where i>(@page-120 order by 中的by后面是不是还有什么
[其他解释]
order by i
[其他解释]
谢谢楼上,asp传参和引用时,出现错误
Microsoft OLE DB Provider for SQL Server 错误 '80040e07' 

将数据类型 varchar 转换为 int 时出错。
即:Set rsNum=DL_CMD.Execute()
totalPut=rsNum(0)
rsNum.Close()
这个出现无法取得统计量
楼上的,好象只能支持列具有唯一值排序,如有重复值行不?
[其他解释]
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

--调用
---exec pro_SqlDataPaging 'register,region','register.*,region.rn','barcode',5,2,1,'1=1 and substring(register.barcode,1,4)=region.code'


ALTER procedure [dbo].[SqlDataPaging]
@tbName varchar(255),        --表名
@tbFields varchar(1000),      --显示的字段
@OrderField varchar(255),   --排序的字段名
@PageSize int,                 --页尺寸
@PageIndex int,                --页码
@OrderType bit,                --排序类型,1是升序,0是降序
@strWhere varchar(1500),    --查询条件
@ReturnValue int output            --返回总记录数
as
declare @strSql varchar(5000)     --主语句
declare @strOrder varchar(200)    --排序
declare @strSqlCount nvarchar(500)--查询记录总数主语句
declare @strtemp varchar(50)      --排序附加语句
--------------排序-----------------1是降序,0为升序
if @OrderType !=0
begin
set @strtemp= '>(select max('
set @strOrder='order by ' + @OrderField + ' asc '
end
else                  --20
begin
set @strtemp= '<(select min('
set @strOrder='order by '+ @OrderField + ' desc'
end
--------------总记录数---------------
if @strWhere !=''
begin
set @strSqlCount='Select @ReturnValueCout = count(*) from  ' + @tbName + ' where  '+ @strWhere
end
else          --30
begin
set @strSqlCount='Select @ReturnValueCout = count(*) from  ' + @tbName
end

--------------如果是第一页------------
if @PageIndex =1
begin
if @strWhere !=''
begin
set @strSql = 'Select top' +str(@PageSize)+ ' ' + @tbFields + '  from '+ @tbName +' where ' + @strWhere + ' ' + @strOrder
end
else
begin
set @strSql = 'Select top' +str(@PageSize)+ ' ' + @tbFields + '  from '+ @tbName + ' ' + @strOrder
end
end
else
begin
if @strWhere !=''
begin
set @strSql='Select top ' +str(@PageSize) + ' ' + @tbFields
+' from ' + @tbName + ' where '+@OrderField +' '
+ @strtemp+ ' ' +@OrderField+ ') from (select top'
+str((@PageIndex-1)*@PageSize) + ' '+@OrderField +' from '+@tbName
+' where '+@strWhere+ ' '+ @strOrder +') as tb)'
+' and '+@strWhere+ ' '+ @strOrder
end
else
begin
set @strSql='Select top ' + str(@PageSize) + ' ' + @tbFields
+' from ' + @tbName + ' where '+@OrderField + ' '
+ @strtemp+ ' ' +@OrderField+ ') from (select top'
+str((@PageIndex-1)*@PageSize) + ' '+@OrderField +' from '+@tbName
+ ' '+ @strOrder +') as tb)'+ @strOrder
end
end
exec sp_executesql @strSqlCount,N'@ReturnValueCout int output',@ReturnValue output


exec(@strSql)
RETURN @ReturnValue






[其他解释]
该回复于2012-11-26 09:32:12被管理员删除

热点排行