谁有好用的 mssql2000分页代码

XUZIFENG 2010-01-23 02:31:43
我查了一下 分页代码
select top 页大小 *

from table1

where id>

(select max (id) from

(select top ((页码-1)*页大小) id from table1 order by id) as T

)

order by id

运行起来不错,可是问题是,他是用id做排序的,当我想用 记录时间做排序时就出错了,
我是在库里有2条记录,他们的时间字段的内容是不同的,
我又将这2条记录复制成n多条后,库里就有2种时间的记录了,各有n/2条,就是有重复的记录
查询出来的只有n/2条了

谁有好的sql语句啊

情况要求如下
查询结果中,可有 id主键,排序是按可能有重复记录的字段排序的
如有存储过程是最好了,最好是一起返回 总记录条数。

如用存储过程,能否再帮我单独写上一句的 sql语句,我好测试
最好是不要用临时表来中转
...全文
178 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Q315054403 2010-01-23
  • 打赏
  • 举报
回复
不仅仅是SQL指令,还要注意结构上设计,以应对数据量多时的性能问题
水中影子 2010-01-23
  • 打赏
  • 举报
回复
select top 10 * from tab where id not in(select top 0 from tab) order by id
10:每页显示多少条
0:从第几条往后取

不知道能不能帮上忙
--小F-- 2010-01-23
  • 打赏
  • 举报
回复
=================分页==========================


  /*分页查找数据*/
  CREATE PROCEDURE [dbo].[GetRecordSet]
  @strSql varchar(8000),--查询sql,如select * from [user]
  @PageIndex int,--查询当页号
  @PageSize int--每页显示记录
  AS
  set nocount on
  declare @p1 int
  declare @currentPage int
  set @currentPage = 0
  declare @RowCount int
  set @RowCount = 0
  declare @PageCount int
  set @PageCount = 0
  exec sp_cursoropen @p1 output,@strSql,@scrollopt=1,@ccopt=1,@rowcount=@rowCount output --得到总记录数
  select @PageCount=ceiling(1.0*@rowCount/@pagesize) --得到总页数
  ,@currentPage=(@PageIndex-1)*@PageSize+1
  select @RowCount,@PageCount
  exec sp_cursorfetch @p1,16,@currentPage,@PageSize
  exec sp_cursorclose @p1
  set nocount off
  GO



  =========================用户注册============================
  /*
  用户注册,也算是添加吧
  */
  Create proc [dbo].[UserAdd]
  (
  @loginID nvarchar(50),     --登录帐号
  @password nvarchar(50), --密码
  @email nvarchar(200) --电子信箱
  )
  as
  declare @userID int --用户编号
  --登录账号已经被注册
  if exists(select loginID from tableName where loginID = @loginID)
  begin
  return -1;
  end
  --邮箱已经被注册
  else if exists(select email from tableName where email = @email)
  begin
  return -2;
  end
  --注册成功
  else
  begin
  select @userID = isnull(max(userID),100000)+1 from tableName
  insert into tableName
  (userID,loginID,[password],userName,linkNum,address,email,createTime,status)
  values
  (@userID,@loginID,@password,'','','',@email,getdate(),1)
  return @userID
  end



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fredrickhu/archive/2009/10/28/4740536.aspx
Mr_Nice 2010-01-23
  • 打赏
  • 举报
回复
ws_hgo 2010-01-23
  • 打赏
  • 举报
回复


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zjcxc/archive/2003/12/29/20080.aspx

IF OBJECT_ID(N'dbo.p_show') IS NOT NULL
DROP PROCEDURE dbo.p_show
GO

/**//*--实现分页的通用存储过程

显示指定表、视图、查询结果的第X页
对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法
如果视图或查询结果中有主键,不推荐此方法
如果使用查询语句,而且查询语句使用了order by,则查询语句必须包含top 语句

最后更新时间: 2008.01.20
--邹建 2003.09(引用请保留此信息)--*/

/**//*--调用示例
EXEC dbo.p_show
@QueryStr = N'tb',
@PageSize = 5,
@PageCurrent = 3,
@FdShow = 'id, colid, name',
@FdOrder = 'colid, name'
select id, colid from tb
order by colid, name


EXEC dbo.p_show
@QueryStr = N'
SELECT TOP 100 PERCENT
*
FROM dbo.sysobjects
ORDER BY xtype',
@PageSize = 5,
@PageCurrent = 2,
@FdShow = 'name, xtype',
@FdOrder = 'xtype, name'
--*/
CREATE PROC dbo.p_show
@QueryStr nvarchar(4000), -- 表名、视图名、查询语句
@PageSize int=10, -- 每页的大小(行数)
@PageCurrent int=1, -- 要显示的页
@FdShow nvarchar (4000) = N'', -- 要显示的字段列表,如果查询结果不需要标识字段,需要指定此值,且不包含标识字段
@FdOrder nvarchar (1000) = N'' -- 排序字段列表
AS
SET NOCOUNT ON
DECLARE
@FdName sysname, --表中的主键或表、临时表中的标识列名
@Id1 sysname, --开始和结束的记录号
@Id2 sysname,
@Obj_ID int --对象ID

--表中有复合主键的处理
DECLARE
@strfd nvarchar(2000), --复合主键列表
@strjoin nvarchar(4000), --连接字段
@strwhere nvarchar(2000) --查询条件


SELECT
@Obj_ID = OBJECT_ID(@QueryStr),
@FdShow = CASE
WHEN @FdShow > N'' THEN N' ' + @FdShow
ELSE N' *'
END,
@FdOrder = CASE
WHEN @FdOrder > N'' THEN N' ORDER BY ' + @FdOrder
ELSE N' '
END,
@QueryStr = CASE
WHEN @Obj_ID IS NULL THEN N' (' + @QueryStr + N')A'
ELSE N' ' + @QueryStr
END

-- 如果显示第一页,可以直接用 top 来完成
IF @PageCurrent = 1
BEGIN
SELECT
@Id1 = CAST(@PageSize as varchar(20))
EXEC(N'
SELECT TOP ' + @Id1 + N'
' + @FdShow + N'
FROM ' + @QueryStr + N'
' + @FdOrder
)
RETURN
END

-- 如果是表, 则检查表中是否有标识更或主键
IF @Obj_ID IS NULL OR OBJECTPROPERTY(@Obj_ID, 'IsTable') = 0
GOTO lb_usetemp
ELSE
BEGIN
SELECT
@Id1 = CAST(@PageSize as varchar(20)),
@Id2 = CAST((@PageCurrent - 1) * @PageSize as varchar(20))

-- 标识列
SELECT
@FdName = name
FROM dbo.syscolumns
WHERE id = @Obj_ID
AND status = 0x80
IF @@ROWCOUNT = 0 --如果表中无标识列,则检查表中是否有主键
BEGIN
DECLARE
@pk_number int

SELECT
@strfd = N'',
@strjoin = N'',
@strwhere = N''

SELECT
@strfd = @strfd
+ N',' + QUOTENAME(name),
@strjoin = @strjoin
+ N' AND A.' + QUOTENAME(name)
+ N'=B.' + QUOTENAME(name),
@strwhere = @strwhere
+ N' AND B.' + QUOTENAME(name) + N' IS NULL'
FROM(
SELECT
IX.id, IX.indid,
IXC.colid, ixc.keyno,
C.name
FROM dbo.sysobjects O,
dbo.sysindexes IX,
dbo.sysindexkeys IXC,
dbo.syscolumns C
WHERE O.parent_obj = @Obj_ID
AND O.xtype = 'PK'
AND O.name = IX.name
AND IX.id = @Obj_ID
AND IX.id = IXC.id
AND IX.indid = IXC.indid
AND IXC.id = C.id
AND IXC.colid = C.colid
)A
ORDER BY keyno

SELECT
@pk_number = @@ROWCOUNT,
@strfd = STUFF(@strfd, 1, 1, N''),
@strjoin = STUFF(@strjoin, 1, 5, N''),
@strwhere = STUFF(@strwhere, 1, 5, N'')

IF @pk_number = 0
GOTO lb_usetemp --如果表中无主键,则用临时表处理
ELSE IF @pk_number = 1
BEGIN
SELECT
@FdName = @strfd
GOTO lb_useidentity -- 使用单一主键
END
ELSE
GOTO lb_usepk -- 使用复合主键
END
END

/**//*--使用标识列或主键为单一字段的处理方法--*/
lb_useidentity:
EXEC(N'
SELECT TOP ' + @Id1 + N'
' + @FdShow + N'
FROM '+@QueryStr + N'
WHERE ' + @FdName + ' NOT IN(
SELECT TOP ' + @Id2 + N'
' + @FdName + '
FROM ' + @QueryStr + N'
' + @FdOrder + N')
' + @FdOrder + N'
')
RETURN

/**//*--表中有复合主键的处理方法--*/
lb_usepk:
EXEC(N'
SELECT
' + @FdShow + N'
FROM(
SELECT TOP ' + @Id1 + N'
A.*
FROM ' + @QueryStr + N' A
LEFT JOIN(
SELECT TOP ' + @Id2 + N'
' + @strfd + N'
FROM ' + @QueryStr + N'
' + @FdOrder + N'
)B
ON ' + @strjoin + N'
WHERE ' + @strwhere + N'
' + @FdOrder + N'
)A
' + @FdOrder + N'
')
RETURN

/**//*--用临时表处理的方法--*/
lb_usetemp:
SELECT
@FdName = QUOTENAME(N'ID_' + CAST(NEWID() as varchar(40))),
@Id1 = CAST(@PageSize * (@PageCurrent-1) as varchar(20)),
@Id2 = CAST(@PageSize * @PageCurrent-1 as varchar(20))

EXEC(N'
SELECT
' + @FdName + N' = IDENTITY(int, 0, 1),
' + @FdShow + N'
INTO #tb
FROM(
SELECT TOP 100 PERCENT
*
FROM ' + @QueryStr + N'
' + @FdOrder + N'
)A
' + @FdOrder + N'

SELECT
' + @FdShow + N'
FROM #tb
WHERE ' + @FdName + ' BETWEEN ' + @Id1 + ' AND ' + @Id2 + N'
'
)
GO
mendel 2010-01-23
  • 打赏
  • 举报
回复
自己用的,你看看行不行

CREATE PROCEDURE dbo.sp_GetPageData(
@intPagesize int,--页大小
@intPage int,--当前页
@intDoCount int,--是否统计记录数和页数1统计,0不统计
@intPageCount int out,--总页数
@intRecordCount int out,--总记录数
@strTableName varchar(100),--要查询的表名
@strOrder varchar(1000),--排序方式,可以多字段排序,请自行输入DESC或ASC
@strOrder1 varchar(1000),--反序排序,请将strOrder中的Desc换成asc或asc换成desc
@strWhere varchar(1000),--条件字段
@strFields varchar(1000),--要显示的字段
@strKeyField varchar(50)--关键字段,自动编号类型
)as
set nocount on
declare @strTempSql nvarchar(2000)
if @strWhere<>'' set @strWhere=' Where '+@strWhere
if @strOrder<>'' set @strOrder = ' Order By '+@strOrder
if @strOrder1<>'' set @strOrder1= ' Order By '+@strOrder1
--判断是否需要统计页数及记录数
if @intDoCount=1
begin
set @strTempSql='select @intRecordCount=count(*) from '+@strTableName+@strWhere
exec sp_executesql @strTempSql,N'@intRecordCount int out',@intRecordCount out
set @intPageCount=(@intRecordCount+@intPagesize-1)/@intPagesize
end
--如果当前页是1,直接使用top选第一页
if @intPage=1
begin
set @strTempSql='select top '+str(@intPagesize)+' '+@strFields+' From '+@strTableName+@strWhere +@strOrder1
end
else
begin
--如果是最后一页,判断还有多少条记录要显示
declare @intTempTop int
set @intTempTop=@intPagesize
if @intPage=@intPageCount
begin
set @intTempTop=@intRecordCount %@intPagesize
if @intTempTop=0 set @intTempTop=@intPagesize
end
if @intPage>@intPageCount/2
begin
set @strTempSql='select top '+str(@intTempTop)+' '+@strFields+' From '+@strTableName+' where '+@strKeyField+' in(select Top '+str((@intPageCount-@intPage)*@intPagesize+@intTempTop)+' '+@strKeyField+' From '+@strTableName+@strWhere+@strOrder+') '+@strOrder1
end
else
begin
set @strTempSql='select top '+str(@intTempTop)+' '+@strFields+' From '+@strTableName+' Where '+@strKeyField+' in(select top '+str(@intTempTop)+' '+@strKeyField+' From '+@strTableName+' where '+@strKeyField+' in(select Top '+str(@intPage*@intPagesize)+' '+@strKeyField+' From '+@strTableName+@strWhere+@strOrder1+') '+@strOrder+') '+@strOrder1
end
end
set nocount off
--print @strTempSql
exec sp_executesql @strTempSql
return
GO

黄_瓜 2010-01-23
  • 打赏
  • 举报
回复
http://blog.csdn.net/zjcxc/category/125592.aspx
黄_瓜 2010-01-23
  • 打赏
  • 举报
回复
看老大的博客,或者等xiaoF来贴
foolwharf 2010-01-23
  • 打赏
  • 举报
回复
找个源程序就有了
ASPNETCHENGXU 2010-01-23
  • 打赏
  • 举报
回复
一段存储过程的分页,不知道对你有用吗

go
--创建存储过程
create procedure cndoup_getpageofrecords
(
@pagesize int = 20, --分页大小
@currentpage int , --第几页
@columns varchar(1000), --需要得到的字段
@tablename varchar(100), --需要查询的表
@condition varchar(1000) , --查询条件, 不用加where关键字
@asccolumn varchar(100) , --排序的字段名 (即 order by column asc/desc)
@bitordertype bit = 0, --排序的类型 (0为升序,1为降序)
@pkcolumn varchar(50) --主键名称
)
as
begin --存储过程开始
declare @strsql varchar(5000) --该存储过程最后执行的语句
declare @strordertype varchar(1000) --排序类型语句 (order by column asc或者order by column desc)

begin
if @bitordertype = 1 --降序
begin
set @strordertype = ' order by '+@asccolumn+' desc'
end
else --升序
begin
set @strordertype = ' order by '+@asccolumn+' asc'
end

if @currentpage = 1 --第一页
begin
if @condition != ''
set @strsql = 'select top '+str(@pagesize)+' '+@columns+' from '+@tablename+' where '+@condition+@strordertype
else
set @strsql = 'select top '+str(@pagesize)+' '+@columns+' from '+@tablename+@strordertype
end

else -- 其他页
begin
if @condition !=''
set @strsql = 'select top '+str(@pagesize)+' '+@columns+' from '+@tablename+' where '+@condition+' and ('+@pkcolumn+' not in (select top '+str((@pagesize-1)*@pagesize)+' '+@pkcolumn+' from '+@tablename+' where '+@condition+@strordertype+'))'+@strordertype
else
set @strsql= 'select top '+str(@pagesize)+' '+@columns+' from '+@tablename+' where ('+@pkcolumn+' not in (select top '+str((@currentpage-1)*@pagesize)+' '+@pkcolumn+' from '+@tablename+@strordertype+'))'+@strordertype
end
end
exec (@strsql)
end

wangxianshou 2010-01-23
  • 打赏
  • 举报
回复
写法有好多种,曾经看过一个总结的帖子,忘了哪个了

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧