sql2000和sql2005分页存储过程
MSSQL2000

set?QUOTED_IDENTIFIER?ON
go




ALTER?PROC?[dbo].[PROCE_PageView2000]
(
@tbname?????nvarchar(100),???????????????--要分页显示的表名
@FieldKey???nvarchar(1000),??????--用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
@PageCurrent?int=1,???????????????--要显示的页码
@PageSize???int=10,????????????????--每页的大小(记录数)
@FieldShow?nvarchar(1000)='',??????--以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder?nvarchar(1000)='',??????--以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
@WhereString????nvarchar(1000)=N'',?????--查询条件
@RecordCount?int?OUTPUT?????????????--总记录数
)
AS
SET?NOCOUNT?ON
--检查对象是否有效
--IF?OBJECT_ID(@tbname)?IS?NULL
--BEGIN
--????RAISERROR(N'对象"%s"不存在',1,16,@tbname)
--????RETURN
--END
--IF?OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
--????AND?OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
--????AND?OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
--BEGIN
--????RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
--????RETURN
--END
--分页字段检查
IF?ISNULL(@FieldKey,N'')=''
BEGIN
????RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
????RETURN
END
--其他参数检查及规范
IF?ISNULL(@PageCurrent,0)<1?SET?@PageCurrent=1
IF?ISNULL(@PageSize,0)<1?SET?@PageSize=10
IF?ISNULL(@FieldShow,N'')=N''?SET?@FieldShow=N'*'
IF?ISNULL(@FieldOrder,N'')=N''
????SET?@FieldOrder=N''
ELSE
????SET?@FieldOrder=N'ORDER?BY?'+LTRIM(@FieldOrder)
IF?ISNULL(@WhereString,N'')=N''
????SET?@WhereString=N''
ELSE
????SET?@WhereString=N'WHERE?('+@WhereString+N')'
--如果@RecordCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@RecordCount赋值)
IF?@RecordCount?IS?NULL
BEGIN
????DECLARE?@sql?nvarchar(4000)
????SET?@sql=N'SELECT?@RecordCount=COUNT(*)'
????????+N'?FROM?'+@tbname
????????+N'?'+@WhereString
????EXEC?sp_executesql?@sql,N'@RecordCount?int?OUTPUT',@RecordCount?OUTPUT
END
--计算分页显示的TOPN值
DECLARE?@TopN?varchar(20),@TopN1?varchar(20)
SELECT?@TopN=@PageSize,
????@TopN1=(@PageCurrent-1)*@PageSize
--第一页直接显示
IF?@PageCurrent=1
????EXEC(N'SELECT?TOP?'+@TopN
????????+N'?'+@FieldShow
????????+N'?FROM?'+@tbname
????????+N'?'+@WhereString
????????+N'?'+@FieldOrder)
ELSE
BEGIN
????--处理别名
????IF?@FieldShow=N'*'
????????SET?@FieldShow=N'a.*'
????--生成主键(惟一键)处理条件
????DECLARE?@Where1?nvarchar(4000),@Where2?nvarchar(4000),
????????@s?nvarchar(1000),@Field?sysname
????SELECT?@Where1=N'',@Where2=N'',@s=@FieldKey
????WHILE?CHARINDEX(N',',@s)>0
????????SELECT?@Field=LEFT(@s,CHARINDEX(N',',@s)-1),
????????????@s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
????????????@Where1=@Where1+N'?AND?a.'+@Field+N'=b.'+@Field,
????????????@Where2=@Where2+N'?AND?b.'+@Field+N'?IS?NULL',
????????????@WhereString=REPLACE(@WhereString,@Field,N'a.'+@Field),
????????????@FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),
????????????@FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)
????SELECT?@WhereString=REPLACE(@WhereString,@s,N'a.'+@s),
????????@FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s),
????????@FieldShow=REPLACE(@FieldShow,@s,N'a.'+@s),
????????@Where1=STUFF(@Where1+N'?AND?a.'+@s+N'=b.'+@s,1,5,N''),????
????????@Where2=CASE
????????????WHEN?@WhereString=''?THEN?N'WHERE?('
????????????ELSE?@WhereString+N'?AND?('
????????????END+N'b.'+@s+N'?IS?NULL'+@Where2+N')'
????--执行查询
????EXEC(N'SELECT?TOP?'+@TopN
????????+N'?'+@FieldShow
????????+N'?FROM?'+@tbname
????????+N'?a?LEFT?JOIN(SELECT?TOP?'+@TopN1
????????+N'?'+@FieldKey
????????+N'?FROM?'+@tbname
????????+N'?a?'+@WhereString
????????+N'?'+@FieldOrder
????????+N')b?ON?'+@Where1
????????+N'?'+@Where2
????????+N'?'+@FieldOrder)
END





?
MSSQL2005
set?ANSI_NULLS?ON
set?QUOTED_IDENTIFIER?ON
go





ALTER?PROCEDURE?[dbo].[PROCE_SQL2005PAGECHANGE]
(
?@TableName?varchar(50),????????????--表名
?@ReFieldsStr?varchar(200)?=?'*',???--字段名(全部字段为*)
?@OrderString?varchar(200),?????????--排序字段(必须!支持多字段不用加order?by)
?@WhereString?varchar(500)?=N'',??--条件语句(不用加where)
?@PageSize?int,?????????????????????--每页多少条记录
?@PageIndex?int?=?1?,???????????????--指定当前为第几页
?@TotalRecord?int?output????????????--返回总记录数
)
AS
?
BEGIN????
????--处理开始点和结束点
????Declare?@StartRecord?int;
????Declare?@EndRecord?int;?
????Declare?@TotalCountSql?nvarchar(500);?
????Declare?@SqlString?nvarchar(2000);????
????set?@StartRecord?=?(@PageIndex-1)*@PageSize?+?1
????set?@EndRecord?=?@StartRecord?+?@PageSize?-?1?
????SET?@TotalCountSql=?N'select?@TotalRecord?=?count(*)?from?'?+?@TableName;--总记录数语句
????SET?@SqlString?=?N'(select?row_number()?over?(order?by?'+?@OrderString?+')?as?rowId,'+@ReFieldsStr+'?from?'+?@TableName;--查询语句
????--
????IF?(@WhereString!?=?''?or?@WhereString!=null)
????????BEGIN
????????????SET?@TotalCountSql=@TotalCountSql?+?'??where?'+?@WhereString;
????????????SET?@SqlString?=@SqlString+?'??where?'+?@WhereString;????????????
????????END
????--第一次执行得到
????--IF(@TotalRecord?is?null)
????--???BEGIN
???????????EXEC?sp_executesql?@totalCountSql,N'@TotalRecord?int?out',@TotalRecord?output;--返回总记录数
????--??END
????----执行主语句
????set?@SqlStringc