CREATE PROCEDURE sp_page
  @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),--查询条件
  @pages      int OUTPUT   --总页数
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
SET @sql='SELECT @pages=CEILING((COUNT(*)+0.0)/'+CAST(@pagesize AS varchar)+
         ') FROM '+@tb+@where2
EXEC sp_executesql @sql,N'@pages int OUTPUT',@pages OUTPUT--计算总页数
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'
IF @page=1--第一页
  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)
GO

解决方案 »

  1.   

    --try
    ALTER PROCEDURE page_list_test
    (@TBname VarChar(50),
    @pagesize int,
    @pageindex int,
    @docount bit,
    @name VarChar(50),
    @clound VarChar(50))
    as
    set nocount on
    declare @RecordCount intif(@docount=1)EXEC('select count(*) from '+ ' ' +@TBname+ ' '+'where' +' '+@clound+'='+''''+@name+'''')
    else
    begin
    if(@pageindex=1)
    exec('select top '+@pagesize+'* from '+' '+@TBname+' '+'where' +' '+@clound+'='+''''+@name+'''' +'order by id desc')
    else
    begin
    declare @sql varchar(4000)
    declare @PageUpperBound int
    declare @endrecords int
    set @PageUpperBound=@pageindex*@pagesize
    if(@PageUpperBound-@pagesize)>=@RecordCount
    select ''
    else if(@RecordCount-(@PageUpperBound-@pagesize)<=@pagesize)begin
    set @endrecords=@RecordCount-(@PageUpperBound-@pagesize)
    set @sql =@sql +'select * from (select top '+@endrecords+' * from'+@TBname+'where'+ @clound+'='+''''+@name+''''+' order by id)A order by id desc'
    EXEC @sql
    end
    else
    begin
    set @sql =@sql +'select *  from (select top '+' '+@pagesize+'* from (select top '+@PageUpperBound+' * from '+@TBname+'where'+ @clound+'='+''''+@name+''''+' order by id desc)A order by id)B order by id desc'
    EXEC @sql
    end
    end
    end
    set nocount off
    GO
      

  2.   

    服务器: 消息 245,级别 16,状态 1,过程 page_list_test,行 46
    将 varchar 值 '* from (select top ' 转换为数据类型为 int 的列时发生语法错误。
    set @sql =@sql +'select *  from (select top '+' '+@pagesize+'* from (select top '+@PageUpperBound+' * from '+@TBname+'where'+ @clound+'='+''''+@name+''''+' order by id desc)A order by id)B order by id desc'还是老问题 就不知道这句哪里错了!!!
      

  3.   

    --最好的办法,你把SQL,Print 出来,很容易找的!!
      

  4.   

    提示出错 就是这里啊
    还怎么PRINT啊
      

  5.   

    --try
    CREATE PROCEDURE page_list_test(@TBname VarChar(50),
    @pagesize int,
    @pageindex int,
    @docount bit,
    @name VarChar(50),
    @clound VarChar(50))
    as
    set nocount on
    declare @RecordCount int
    if(@docount=1)EXEC('select count(*) from '+ ' ' +@TBname+ ' '+'where' +' '+@clound+'='+''''+@name+'''')
    else
    begin
    if(@pageindex=1)
    exec('select top '+@pagesize+'* from '+' '+@TBname+' '+'where' +' '+@clound+'='+''''+@name+'''' +'order by id desc')
    else
    begin
    declare @sql varchar(4000)
    declare @PageUpperBound VarChar(50)
    declare @endrecords VarChar(50)
    set @PageUpperBound=@pageindex*@pagesize
    if(@PageUpperBound-@pagesize)>=@RecordCount
    select ''
    else if(@RecordCount-(@PageUpperBound-@pagesize)<=@pagesize)begin
    set @endrecords=@RecordCount-(@PageUpperBound-@pagesize)
    set @sql =@sql +'select * from (select top '+cast(@endrecords as varchar)+' * from'+@TBname+'where'+ @clound+'='+''''+@name+''''+' order by id)A order by id desc'
    EXEC @sql
    end
    else
    begin
    set @sql =@sql +'select *  from (select top '+' '+cast(@pagesize as varchar) +' * from (select top '+cast(@PageUpperBound as varchar)+' * from '+@TBname+'where'+ @clound+'='+''''+@name+''''+' order by id desc)A order by id)B order by id desc'
    EXEC @sql
    end
    end
    end
    set nocount off
    GO
      

  6.   

    出错这一行,把 select top 后面的 @pagesize 造型为 varchar 型。
    convert(varchar,@pagesize)set @sql =@sql +'select *  from (select top '+' '+ convert(varchar,@pagesize)+'* from (select top '+@PageUpperBound+' * from '+@TBname+'where'+ @clound+'='+''''+@name+''''+' order by memberid desc)A order by memberid)B order by memberid desc'