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

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--返回总页数