--分页存储过程(联合查询)
create proc sp_Page
@PageIndex int,----当前页索引
@RowCount int,----总记录数
@TableName varchar(500),----表名
@field varchar(500),----字段名
@liketext varchar(500),-----Where条件
@OrderByName varchar(50)-----OrderBy字段
as
declare @sqlText varchar(1000)
set @sqlText =
' select top '+cast(@RowCount as varchar(50))+' * from
(select top '+cast(@RowCount as varchar(50))+
'* from (select top ' +cast(@RowCount*@PageIndex as varchar(50))+
@field+' from '+@TableName+' where 1=1 ' +@liketext+ ' order by '+@OrderByName+' desc)TempTable
order by '+@OrderByName+ ' )TempTable2 order by ' +@OrderByName+' desc'
exec( @SqlText)
假如现在有5条数据
每页显示3条
那么应该是这样
`
第一条数据
第二条数据
第三条数据
12 第四条数据
第五条数据
12
..
..
..现在使自己写的这个是这样儿了
第一条数据
第二条数据
第三条数据
12
第三条数据
第四条数据
第五条数据
12
..
它必须得给最后一页填充满了
大侠们帮咱改改呀 T_T
create proc sp_Page
@PageIndex int,----当前页索引
@RowCount int,----总记录数
@TableName varchar(500),----表名
@field varchar(500),----字段名
@liketext varchar(500),-----Where条件
@OrderByName varchar(50)-----OrderBy字段
as
declare @sqlText varchar(1000)
set @sqlText =
' select top '+cast(@RowCount as varchar(50))+' * from
(select top '+cast(@RowCount as varchar(50))+
'* from (select top ' +cast(@RowCount*@PageIndex as varchar(50))+
@field+' from '+@TableName+' where 1=1 ' +@liketext+ ' order by '+@OrderByName+' desc)TempTable
order by '+@OrderByName+ ' )TempTable2 order by ' +@OrderByName+' desc'
exec( @SqlText)
假如现在有5条数据
每页显示3条
那么应该是这样
`
第一条数据
第二条数据
第三条数据
12 第四条数据
第五条数据
12
..
..
..现在使自己写的这个是这样儿了
第一条数据
第二条数据
第三条数据
12
第三条数据
第四条数据
第五条数据
12
..
它必须得给最后一页填充满了
大侠们帮咱改改呀 T_T
除非使用between ... and 或者 >= 或者 <=之类的,
那么就不会填充了.
他这个主要是连该top 几都没算,直接就top 当页该显示的记录数了。
试试我的分页吧,性能还行。
http://www.dmblogs.com/nzBlog/article.asp?id=25
@strSql varchar(8000),
@nPageSize int,
@nPageCount int
as
SET NOCOUNT ON
DECLARE @P1 INT
DECLARE @nRowCount INT
--//注意:@scrollopt = 1 会取得Select的时候的总行数
EXEC sp_cursoropen @P1 OUTPUT, @strSql, @scrollopt = 1, @ccopt = 1, @rowcount = @nRowCount OUTPUT
IF (@P1 != 0)
BEGIN
SELECT @nRowCount AS nRecordCount, ceiling(1.0 * @nRowCount / @nPageSize) AS nPageCount, @nPageCount AS nPage
SET @nPageCount = (@nPageCount - 1) * @nPageSize + 1
EXEC sp_cursorfetch @P1, 32, @nPageCount, @nPageSize
EXEC sp_cursorclose @P1
END在程序中取第二个记录集 set rs=rs.nextrecordset
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_show]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_show]
GOCREATE Proc p_show
@QueryStr nvarchar(4000), --表名、视图名、查询语句
@PageSize int=10, --每页的大小(行数)
@PageCurrent int=1, --要显示的页
@FdShow nvarchar (4000)='', --要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段
@FdOrder nvarchar (1000)='' --排序字段列表
as
declare @FdName nvarchar(250) --表中的主键或表、临时表中的标识列名
,@Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号
,@Obj_ID int --对象ID
--表中有复合主键的处理
declare @strfd nvarchar(2000) --复合主键列表
,@strjoin nvarchar(4000) --连接字段
,@strwhere nvarchar(2000) --查询条件
select @Obj_ID=object_id(@QueryStr)
,@FdShow=case isnull(@FdShow,'') when '' then ' *' else ' '+@FdShow end
,@FdOrder=case isnull(@FdOrder,'') when '' then '' else ' order by '+@FdOrder end
,@QueryStr=case when @Obj_ID is not null then ' '+@QueryStr else ' ('+@QueryStr+') a' end--如果显示第一页,可以直接用top来完成
if @PageCurrent=1
begin
select @Id1=cast(@PageSize as varchar(20))
exec('select top '+@Id1+@FdShow+' from '+@QueryStr+@FdOrder)
return
end--如果是表,则检查表中是否有标识更或主键
if @Obj_ID is not null and objectproperty(@Obj_ID,'IsTable')=1
begin
select @Id1=cast(@PageSize as varchar(20))
,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20)) select @FdName=name from syscolumns where id=@Obj_ID and status=0x80
if @@rowcount=0 --如果表中无标识列,则检查表中是否有主键
begin
if not exists(select 1 from sysobjects where parent_obj=@Obj_ID and xtype='PK')
goto lbusetemp --如果表中无主键,则用临时表处理 select @FdName=name from syscolumns where id=@Obj_ID and colid in(
select colid from sysindexkeys where @Obj_ID=id and indid in(
select indid from sysindexes where @Obj_ID=id and name in(
select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID
)))
if @@rowcount>1 --检查表中的主键是否为复合主键
begin
select @strfd='',@strjoin='',@strwhere=''
select @strfd=@strfd+',['+name+']'
,@strjoin=@strjoin+' and a.['+name+']=b.['+name+']'
,@strwhere=@strwhere+' and b.['+name+'] is null'
from syscolumns where id=@Obj_ID and colid in(
select colid from sysindexkeys where @Obj_ID=id and indid in(
select indid from sysindexes where @Obj_ID=id and name in(
select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID
)))
select @strfd=substring(@strfd,2,2000)
,@strjoin=substring(@strjoin,5,4000)
,@strwhere=substring(@strwhere,5,4000)
goto lbusepk
end
end
end
else
goto lbusetemp/*--使用标识列或主键为单一字段的处理方法--*/
lbuseidentity:
exec('select top '+@Id1+@FdShow+' from '+@QueryStr
+' where '+@FdName+' not in(select top '
+@Id2+' '+@FdName+' from '+@QueryStr+@FdOrder
+')'+@FdOrder
)
return/*--表中有复合主键的处理方法--*/
lbusepk:
exec('select '+@FdShow+' from(select top '+@Id1+' a.* from
(select top 100 percent * from '+@QueryStr+@FdOrder+') a
left join (select top '+@Id2+' '+@strfd+'
from '+@QueryStr+@FdOrder+') b on '+@strjoin+'
where '+@strwhere+') a'
)
return/*--用临时表处理的方法--*/
lbusetemp:
select @FdName='[ID_'+cast(newid() as varchar(40))+']'
,@Id1=cast(@PageSize*(@PageCurrent-1) as varchar(20))
,@Id2=cast(@PageSize*@PageCurrent-1 as varchar(20))exec('select '+@FdName+'=identity(int,0,1),'+@FdShow+'
into #tb from'+@QueryStr+@FdOrder+'
select '+@FdShow+' from #tb where '+@FdName+' between '
+@Id1+' and '+@Id2
)GO
--SQL提供的存储过程
exec sp_cursoropen @p1 output,@sqlstr
exec sp_cursoropen @p1,16,@begincol,@pagesize
exec sp_cursoropen @p1alter proc roypage
(@tablename varchar(255),@pagecount int=1,@pagesize int=99999999)
as
begin
set nocount on
declare @P1 int
declare @sqlstr nvarchar(4000)
set @pagecount=(@pagecount-1)*@pagesize+1
set @sqlstr='select * from '+@tablename
exec sp_cursoropen @P1 output,@sqlstr
exec sp_cursoropen @P1,16,@pagecount,@pagesize
exec sp_cursoropen @P1
end
--exec roypage 'product',10,100
方法2
create proc roypage1
(@sqlstr nvarchar(4000),@pagecount int=1,@pagesize int=99999999)
as
begin
set nocount on
declare @P1 int
set @pagecount=(@pagecount-1)*@pagesize+1
exec sp_cursoropen @P1 output,@sqlstr
exec sp_cursoropen @P1,16,@pagecount,@pagesize
exec sp_cursoropen @P1
endexec roypage1 'select * from product ',10,100
谢谢啦
真的非常的快
o(∩_∩)o...哈哈