就传入 页数,码数 
返回数据对像 
和一共有多少条记录就行了 谢谢也不知道前面的程序设置是怎么搞的 一个表记录会员的积分 
竟然没有主键什么来的 他们以前都是Selet all 的方式读取全部 
现在记录多了搞得慢得要命 查询一点要1-2分种 
所以想搞个分页 我一看,妈的 主键什么都没有,我又不能对表结构进行改动 谢谢 急啊http://topic.csdn.net/u/20081203/17/07906b4b-c9f6-4bae-95ba-0e36ed7fdc16.html?seed=1536146836

解决方案 »

  1.   

    老大的:
    ALTER PROC PageView 
    @tbname    sysname,          --要分页显示的表名 
    @FieldKey  sysname,          --用于定位记录的主键(惟一键)字段,只能是单个字段 
    @PageCurrent int=1,            --要显示的页码 
    @PageSize  int=10,            --每页的大小(记录数) 
    @FieldShow  nvarchar(1000)='',  --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段 
    @FieldOrder  nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC 
                                              --用于指定排序顺序 
    @Where    nvarchar(1000)='',  --查询条件 
    @PageCount  int OUTPUT        --总页数 
    AS 
    DECLARE @sql nvarchar(4000) 
    SET NOCOUNT ON 
    --检查对象是否有效 
    IF OBJECT_ID(@tbname) IS NULL 
    BEGIN 
    RAISERROR(N'对象"%s"不存在',1,16,@tbname) 
    RETURN 
    END 
    IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0 
    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0 
    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0 
    BEGIN 
    RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname) 
    RETURN 
    END --分页字段检查 
    IF ISNULL(@FieldKey,N'')='' 
    BEGIN 
    RAISERROR(N'分页处理需要主键(或者惟一键)',1,16) 
    RETURN 
    END --其他参数检查及规范 
    IF ISNULL(@PageCurrent,0) <1 SET @PageCurrent=1 
    IF ISNULL(@PageSize,0) <1 SET @PageSize=10 
    IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*' 
    IF ISNULL(@FieldOrder,N'')=N'' 
    SET @FieldOrder=N'' 
    ELSE 
    SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder) 
    IF ISNULL(@Where,N'')=N'' 
    SET @Where=N'' 
    ELSE 
    SET @Where=N'WHERE ('+@Where+N')' --如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值) 
    IF @PageCount IS NULL 
    BEGIN 
    SET @sql=N'SELECT @PageCount=COUNT(*)' 
    +N' FROM '+@tbname 
    +N' '+@Where 
    EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT 
    SET @PageCount=(@PageCount+@PageSize-1)/@PageSize 
    END --计算分页显示的TOPN值 
    DECLARE @TopN varchar(20),@TopN1 varchar(20) 
    SELECT @TopN=@PageSize, 
    @TopN1=@PageCurrent*@PageSize --第一页直接显示 
    IF @PageCurrent=1 
    EXEC(N'SELECT TOP '+@TopN 
    +N' '+@FieldShow 
    +N' FROM '+@tbname 
    +N' '+@Where 
    +N' '+@FieldOrder) 
    ELSE 
    BEGIN 
    SELECT @PageCurrent=@TopN1, 
    @sql=N'SELECT @n=@n-1,@s=CASE WHEN @n <'+@TopN 
    +N' THEN @s+N'',''+QUOTENAME(RTRIM(CAST('+@FieldKey 
    +N' as varchar(8000))),N'''''''') ELSE N'''' END FROM '+@tbname 
    +N' '+@Where 
    +N' '+@FieldOrder 
    SET ROWCOUNT @PageCurrent 
    EXEC sp_executesql @sql, 
    N'@n int,@s nvarchar(4000) OUTPUT', 
    @PageCurrent,@sql OUTPUT 
    SET ROWCOUNT 0 
    IF @sql=N'' 
    EXEC(N'SELECT TOP 0' 
    +N' '+@FieldShow 
    +N' FROM '+@tbname) 
    ELSE 
    BEGIN 
    SET @sql=STUFF(@sql,1,1,N'') 
    --执行查询 
    EXEC(N'SELECT TOP '+@TopN 
    +N' '+@FieldShow 
    +N' FROM '+@tbname 
    +N' WHERE '+@FieldKey 
    +N' IN('+@sql 
    +N') '+@FieldOrder) 
    END 
    END 
      

  2.   

    --没有主键,借助临时表,将表的数据读入到临时表,增加一个自增列 ID 然后分页
    --方法1:
    --适用于 SQL Server 2000/2005
    SELECT TOP 页大小 *
    FROM table1
    WHERE id NOT IN
              (
              SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
              )
    ORDER BY id
    --方法2:
    --适用于 SQL Server 2000/2005
    SELECT TOP 页大小 *
    FROM table1
    WHERE id >
              (
              SELECT ISNULL(MAX(id),0) 
              FROM 
                    (
                    SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
                    ) A
              )
    ORDER BY id
    --方法3:
    --适用于 SQL Server 2005
    SELECT TOP 页大小 * 
    FROM 
            (
            SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
            ) A
    WHERE RowNumber > 页大小*(页数-1)
    --说明,页大小:每页的行数;页数:第几页。使用时,请把“页大小”和“页大小*(页数-1)”替换成数字。