以前写的一个分页存储过程,刚才不小心翻出来的


CREATE PROCEDURE GoalerPageSp
@IntPageSize int,
@IntCurrPage int,
@strFields nvarchar(2000),
@strTable varchar(200),
@strWhere varchar(800),
@strOrderType varchar(200),
@strKeyField varchar(50)
AS
SET NOCOUNT ON
DECLARE @tmpSQL nvarchar(4000)--存放动态SQL语句
DECLARE @tmpWhere varchar(800)
DECLARE @tmpAndWhere varchar(800)--用于第N(>1)页上边的查询条件
DECLARE @tmpOrder varchar(200)
DECLARE @tmpD_X varchar(2)
DECLARE @tmpMin_MAX varchar(3)

--设置条件--
IF @strWhere IS NULL OR RTRIM(@strWhere)=
    BEGIN --没有查询条件
        SET @tmpWhere=
        SET @tmpAndWhere=
    END 
ELSE 
    BEGIN --有查询条件
        SET @tmpWhere= WHERE +@strWhere
        SET @tmpAndWhere= AND +@strWhere
    END 

--设置排序--
IF @strOrderType != 0
    BEGIN--倒序 
        SET @tmpD_X = <
        SET @tmpMin_MAX = MIN
        SET @tmpOrder= ORDER BY  +@strKeyField+  DESC
    END 
ELSE 
    BEGIN 
        SET @tmpD_X = >
        SET @tmpMin_MAX = MAX
        SET @tmpOrder= ORDER BY  +@strKeyField+  ASC
    END 
--SQL查询--
IF @IntCurrPage=1
    Set @tmpSQL=SELECT TOP +CAST(@IntPageSize AS VARCHAR)+ +@strFields+ FROM +@strTable+ +@tmpWhere+ +@tmpOrder
ELSE
    SET @tmpSQL=SELECT TOP +CAST(@IntPageSize AS VARCHAR)+ +@strFields+ FROM +@strTable+ WHERE (+@strKeyField+ +@tmpD_X+ (SELECT +@tmpMin_MAX+(+@strKeyField+) FROM (SELECT TOP +CAST(@IntPageSize*(@IntCurrPage-1) AS VARCHAR)+ +@strKeyField+ FROM +@strTable+ +@tmpWhere+ +@tmpOrder+) AS T))+@tmpAndWhere+ +@tmpOrder
EXEC(@tmpSQL)
GO


调用方法:
IntPageSize=20
strTable=" [TableName] "    数据表名称
strFields=" Field1,Field2,Field3,Field4 "    需要读取的列名
strKeyField="Field1"    主键:这里假设Field1为主键
strWhere=""    条件:FieldA=b
strOrderType=1    排序方式:1为倒序,0为顺序

CurrPage=Request.QueryString("Page")
IF(CurrPage<>"" And Isnumeric(CurrPage))THEN
    CurrPage=CLNG(CurrPage)   
    IF(CurrPage<1)THEN CurrPage=1                   
ELSE
    CurrPage=1
END IF

IF strWhere<>"" THEN
    tmpWhere=" WHERE "&strWhere
ELSE 
    tmpWhere=""
END IF

IF(SESSION("RecCount")<>"")THEN
    IF(SESSION("strWhere")<>strWhere)THEN
        RecCount=Conn.Execute("SELECT COUNT("&strKeyField&") FROM "&strTable&tmpWhere)(0)
        SESSION("RecCount")=RecCount
        SESSION("strWhere")=strWhere
    ELSE
        RecCount=SESSION("RecCount")
    END IF
ELSE
    RecCount=Conn.Execute("SELECT COUNT(*) FROM "&strTable&tmpWhere)(0)
    SESSION("RecCount")=RecCount
    SESSION("strWhere")=strWhere
END IF

IF(RecCount MOD IntPageSize <>0)THEN
    IntPageCount=INT(RecCount/IntPageSize)+1
ELSE
    IntPageCount=RecCount/IntPageSize
END IF

SET Cmd=Server.CreateObject("Adodb.Command") 
Cmd.CommandType=4 
SET Cmd.ActiveConnection=Conn 
Cmd.CommandText="GoalerPageSp" 
Cmd.Parameters.Append Cmd.CreateParameter("@IntPageSize",4,1,4,IntPageSize)
Cmd.Parameters.Append Cmd.CreateParameter("@IntCurrPage",4,1,4,CurrPage)
Cmd.Parameters.Append Cmd.CreateParameter("@strFields",200,1,2000,strFields)
Cmd.Parameters.Append Cmd.CreateParameter("@strTable",200,1,200,strTable)
Cmd.Parameters.Append Cmd.CreateParameter("@strWhere",200,1,800,strWhere)
Cmd.Parameters.Append Cmd.CreateParameter("@strOrderType",4,1,4,strOrderType)
Cmd.Parameters.Append Cmd.CreateParameter("@strKeyField",200,1,50,strKeyField)
SET RS=Cmd.Execute()
IF RecCount<1 THEN
    Response.Write("没有记录")
ELSE
    GetRecord=RS.GetRows(IntPageSize)
    For i=0 To Ubound(GetRecord,2)
        Response.Write(GetRecord(0,i),GetRecord(1,i),GetRecord(2,i))    ...输出内容
    NEXT
    GetRecord=Null
END IF
SET RS=NOTHING


有用的朋友请自己慢慢调试吧,总记录是用ASP来取的,存储在SESSION里边,如果每次都统计一次总记录,将会非常费时,当然,如果你想在存储过程里来取总记录和总页数然后返回也是可以的,下边是代码:
--获取记录总数--
SET @tmpSQL=SELECT @getRecordCounts=COUNT(+@strKeyField+) FROM +@strTable+@tmpWhere
EXEC sp_executesql @tmpSQL,N@getRecordCounts int output,@getRecordCounts OUTPUT

--获取总页数--
SET @tempFolatNumber=@getRecordCounts%@IntPageSize
IF @getRecordCounts<=@IntPageSize
    SET @getPageCounts=1
ELSE
BEGIN
    IF @tempFolatNumber != 0
        SET @getPageCounts=(@getRecordCounts/@IntPageSize)+1
    ELSE
        SET @getPageCounts=(@getRecordCounts/@IntPageSize)
END


别忘了返回定义参数:
@getRecordCounts int output,--返回总记录
@getPageCounts int output--返回总页数