ALTERProcedure[dbo].[QuickPage] @strTableNamevarchar(50), --表名 @strFieldListvarchar(1000), --所要查询的字段序列 @strWhereFiltervarchar(1000), --查询条件 @strOrderFieldvarchar(1000), --排序字段 @strKeyFieldvarchar(50), --用来分页的关键字段名 @intPageSizeint, --每页记录数 @intPageIndexint, --当前所要查询的页 @intPageCountint output, --总页数 @intRecordCountint output --总记录数 as declare@sqlnvarchar(4000) --用于构造SQL语句 declare@beginIndexint--起始记录数 declare@residualNumint--余数 begin --构造SQL语句计算总记录数 if@strWhereFilterisnullor@strWhereFilter='' set@sql='SELECT @intRecordCount=count(*) from '+@strTableName else set@sql='SELECT @intRecordCount=count(*) from '+@strTableName+' where '+@strWhereFilter --执行SQL语句计算总记录数,并将其放入@intRecordCount变量中 exec sp_executesql @sql,N'@intRecordCount int output',@intRecordCount output --计算出总页数 set@residualNum=@intRecordCount%@intPageSize if@residualNum=0 set@intPageCount=@intRecordCount/@intPageSize else set@intPageCount= (@intRecordCount/@intPageSize) +1 set@strFieldList=@strFieldList+','+cast(@intPageCountasvarchar) +' as PageCount,'+cast(@intRecordCountasvarchar) +' as RecordCount' begin if@intPageIndex=1 begin if@strWhereFilterisnullor@strWhereFilter='' begin if@strOrderFieldisnullor@strOrderField='' set@sql='SELECT TOP '+cast(@intPageSizeasvarchar) +''+@strFieldList+' FROM '+@strTableName else set@sql='SELECT TOP '+cast(@intPageSizeasvarchar) +''+@strFieldList+' FROM '+@strTableName+' ORDER BY '+@strOrderField end else begin if@strOrderFieldisnullor@strOrderField='' set@sql='SELECT TOP '+cast(@intPageSizeasvarchar) +''+@strFieldList+' FROM '+@strTableName+' where '+@strWhereFilter else set@sql='SELECT TOP '+cast(@intPageSizeasvarchar) +''+@strFieldList+' FROM '+@strTableName+' where '+@strWhereFilter+' ORDER BY '+@strOrderField end end else begin --计算出开始记录位置 set@beginIndex= (@intPageIndex-1) *@intPageSize if@strWhereFilterisnullor@strWhereFilter='' begin if@strOrderFieldisnullor@strOrderField='' set@sql='SELECT TOP '+cast(@intPageSizeasvarchar) +''+@strFieldList+' FROM '+@strTableName+' WHERE '+@strKeyField+' NOT IN (SELECT TOP '+cast(@beginIndexasvarchar) +''+@strKeyField+' FROM '+@strTableName+')' else set@sql='SELECT TOP '+cast(@intPageSizeasvarchar) +''+@strFieldList+' FROM '+@strTableName+' WHERE '+@strKeyField+' NOT IN (SELECT TOP '+cast(@beginIndexasvarchar) +''+@strKeyField+' FROM '+@strTableName+' ORDER BY '+@strOrderField+') ORDER BY '+@strOrderField end else begin if@strOrderFieldisnullor@strOrderField='' set@sql='SELECT TOP '+cast(@intPageSizeasvarchar) +''+@strFieldList+' FROM '+@strTableName+' WHERE '+@strKeyField+' NOT IN (SELECT TOP '+cast(@beginIndexasvarchar) +''+@strKeyField+' FROM '+@strTableName+' where '+@strWhereFilter+')' else set@sql='SELECT TOP '+cast(@intPageSizeasvarchar) +''+@strFieldList+' FROM '+@strTableName+' WHERE '+@strKeyField+' NOT IN (SELECT TOP '+cast(@beginIndexasvarchar) +''+@strKeyField+' FROM '+@strTableName+' where '+@strWhereFilter+' ORDER BY '+@strOrderField+') ORDER BY '+@strOrderField end end end exec(@sql) end
测试
1、生成测试表:
USE[SchoolWebData] GO /**//****** 对象: Table [dbo].[TestTable] 脚本日期: 10/31/2006 15:09:46 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATETABLE[dbo].[TestTable]( [ID][int]IDENTITY(1,1) NOTNULL, [FirstName][nvarchar](100) COLLATE Chinese_PRC_CI_AS NULL, [LastName][nvarchar](100) COLLATE Chinese_PRC_CI_AS NULL, [Country][nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL, [Note][nvarchar](2000) COLLATE Chinese_PRC_CI_AS NULL ) ON[PRIMARY]
2、插入测试记录(20000W条)
SETIDENTITY_INSERT TestTable ON declare@iint set@i=1 while@i<=20000 begin insertinto TestTable([id], FirstName, LastName, Country,Note) values(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX') set@i=@i+1 end SETIDENTITY_INSERT TestTable OFF