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