参考借用了[中国无忧商务网]网友的存储过程CREATE procedure sp_pagesite
(
/*
@Tables     表名                    必选 
@PrimaryKey 主关键字                必选
@pagesize   页码大小                可选  默认值:1
@pageindex  当前页                  可选  默认值:1
@docount    是否只统计总记录数      可选 默认值:否
@Fields     选择字段                可选 默认:所有字段
@Sort       排序语句,不带Order By  可选
@Filter     过滤语句,不带Where     可选
*/
@Tables nvarchar(400),
@PrimaryKey nvarchar(100),
@pagesize int=1,
@pageindex int=1,
@docount bit=0,
@Fields varchar(1000) = '*',
@Sort varchar(1000) = NULL,
@Filter varchar(1000) = NULL)
as
set nocount onDECLARE @strFilter varchar(1000)
DECLARE @strSort varchar(1000)
IF @Filter IS NOT NULL AND @Filter != ''
BEGIN
SET @strFilter = ' WHERE ' + @Filter + ' '
END
ELSE
BEGIN
SET @strFilter = ''
END
IF @Sort IS Not NULL And @Sort!=''
        Begin
                Set @strSort='order by '+@Sort+''
        End
            
if(@docount=1)exec('select count('+@PrimaryKey+') from '+@Tables+' '+@strFilter+'')
else
begin
declare @PageLowerBound int
declare @PageUpperBound int
set @PageLowerBound=(@pageindex-1)*@pagesize
set @PageUpperBound=@PageLowerBound+@pagesize
create table #pageindex(id int identity(1,1) not null,nid int)
set rowcount @PageUpperBound
exec(
'
insert into #pageindex(nid)
select '+@PrimaryKey+' from '+@Tables+' '+@strFilter+' '+@strSort+'
select O.'+@Fields+'
from '+@Tables+' O,#pageindex p
where O.'+@PrimaryKey+'=p.nid and p.id>'+@PageLowerBound+' and p.id<='+@PageUpperBound+' order by p.id
'
)
end
set nocount off
GO

解决方案 »

  1.   

    以下是调用代码只计算总记录数:
    SqlCommand cmd1=new SqlCommand("sp_pagesite",conn.dbconn);
    cmd1.CommandType=CommandType.StoredProcedure;
    cmd1.Parameters.Add("@Tables","JF_News");
    cmd1.Parameters.Add("@PrimaryKey","nID");
    cmd1.Parameters.Add("@Filter","CompanyID="+cid+""+audit_sql);
    cmd1.Parameters.Add("@DoCount",true);
    pager.RecordCount=(int)cmd1.ExecuteScalar();SqlCommand cmd1=new SqlCommand("sp_pagesite",conn.dbconn);
    cmd1.CommandType=CommandType.StoredProcedure;
    cmd1.Parameters.Add("@Tables","JF_News");
    cmd1.Parameters.Add("@PrimaryKey","nID");
    cmd1.Parameters.Add("@PageSize",pager.PageSize);
    cmd1.Parameters.Add("@PageIndex",pager.CurrentPageIndex);
    cmd1.Parameters.Add("@Filter","CompanyID="+cid+""+audit_sql);
    list_news.DataSource=cmd1.ExecuteReader();
    list_news.DataBind();
      

  2.   

    这是我的,传入参数为SQL语句
    CREATE procedure CustomPaginationProcedure
    /*
    功能:此过程也是用于记录分页,此过程可用多表关联的记录分页,过程接受一条SQL语句,用户所有的查询应该在这条语句中已完成,此SQL语句中不能有ORDER BY语句
    Writer:Jeff
    Date:2003.09.20
    */
    (
    @P_field varchar(50)="",      --关键字段,如果没有,将会自己产一个关键字段.
    @order_field varchar(100)="",
    @SqlStr  varchar(4000),
    @pagesize int,
    @pageindex int,
    @recordCount int output)
    AS
    DECLARE @STR1 nvarchar(4000)
    DECLARE @OrderStr varchar(200)
    if @Order_field=""
    SET @OrderStr=""
    else
    begin
    SET @Order_field=REPLACE(@Order_field,",",",SQL.")
    SET @OrderStr=" order by SQL."+@Order_field
    end
    if @P_field<>""
    begin
    SET @SqlStr="("+@SqlStr+")SQL"
    set @STR1=N'select @total2=count(SQL.'+@P_field+') from '+@SqlStr
    end
    else
    begin
    declare @tempSqlStr varchar(4000)
    set @tempSqlStr=lower(@SqlStr)
    SET @SqlStr="("+@SqlStr+")SQL"
    set @STR1=N'select @total2=count(*) from '+@SqlStr
    end
    exec sp_executesql @STR1,N' @total2 int output ',@RecordCount output
    if @P_field<>""
    EXECUTE("
    declare @indextable table(id int identity(1,1),nid bigint);
    declare @PageLowerBound int;
    declare @PageUpperBound int;
    set @PageLowerBound=("+@pageindex+"-1)*"+@pagesize+";
    set @PageUpperBound=@PageLowerBound+"+@pagesize+";
    set rowcount @PageUpperBound;
    insert into @indextable (nid) select SQL."+@P_field+" from "+@SqlStr+@OrderStr+"
    select SQL.* FROM "+@SqlStr+",@indextable t where t.nid=SQL."+@P_field+"  and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id
    set nocount off
    ")
    else
    Begin
    --为记录集添加一个唯一标识字段
    set @tempSqlStr=Replace(@tempSqlStr,'select',' select IDENTITY(bigint, 1, 1) AS gid ,')
    set @tempSqlStr=Replace(@tempSqlStr,'from',' into ##gtable from ')
    print @tempSqlStr
    execute(@tempSqlStr)

    EXECUTE("
    declare @indextable table(id int identity(1,1),nid bigint);
    declare @PageLowerBound int;
    declare @PageUpperBound int;
    set @PageLowerBound=("+@pageindex+"-1)*"+@pagesize+";
    set @PageUpperBound=@PageLowerBound+"+@pagesize+";

    set rowcount @PageUpperBound;
    insert into @indextable (nid) select SQL.gid from ##gtable  SQL "+@OrderStr+"
    select SQL.* FROM ##gtable SQL,@indextable t where t.nid=SQL.gid  and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id
    set nocount off
    drop table ##gtable
    ")
    end
    GO