一个通用的mssql2000的分页存储过程

一个通用的mssql2000的分页存储过程。

mssql大数据的分页存储过程比较常见,用吴旗娃的控件也可以生成分页的代码,但是,假如我需要灵活的传递一些查询参数,却不是很方便,如果我的表比较多,也需要建立很多存储过程,这样比较难以维护。所以有了如下解决方案。

前辈千山一鸟给我的,放出来与大家分享!

ALTER PROCEDURE dbo.P_Pager_SqlServer2000
(
@tableName     sysname,           --要分页显示的表名
@fieldKey   sysname,              --用于定位记录的主键(惟一键)字段,只能是单个字段
@pageIndex bigint=1,              --要显示的页码
@pageSize   int=10,               --每页的大小(记录数)
@fields  nvarchar(1000)='',       --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@orderField  nvarchar(1000)='',   --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
                                  --用于指定排序顺序
@sqlWhere     nvarchar(1000)='',  --查询条件
@pageCount  bigint OUTPUT,        --总页数
@recordCount bigint output        --返回总记录数
)
AS
DECLARE @sql nvarchar(4000)
SET NOCOUNT ON
--检查对象是否有效
IF OBJECT_ID(@tableName) IS NULL
BEGIN
RAISERROR(N'对象"%s"不存在',1,16,@tableName)
RETURN
END
IF OBJECTPROPERTY(OBJECT_ID(@tableName),N'IsTable')=0
AND OBJECTPROPERTY(OBJECT_ID(@tableName),N'IsView')=0
AND OBJECTPROPERTY(OBJECT_ID(@tableName),N'IsTableFunction')=0
BEGIN
RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tableName)
RETURN
END

--分页字段检查
IF ISNULL(@fieldKey,N'')=''
BEGIN
RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
RETURN
END

--其他参数检查及规范
IF ISNULL(@pageIndex,0)<1 SET @pageIndex=1
IF ISNULL(@pageSize,0)<1 SET @pageSize=10
IF ISNULL(@fields,N'')=N'' SET @fields=N'*'
IF ISNULL(@orderField,N'')=N''
SET @orderField=N''
ELSE
SET @orderField=N'ORDER BY '+LTRIM(@orderField)
IF ISNULL(@sqlWhere,N'')=N''
SET @sqlWhere=N''
ELSE
SET @sqlWhere=N'WHERE ('+@sqlWhere+N')'

--如果@pageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@pageCount赋值)
IF @pageCount IS NULL
BEGIN
SET @sql=N'SELECT @pageCount=COUNT(*)'
+N' FROM '+@tableName
+N' '+@sqlWhere
EXEC sp_executesql @sql,N'@pageCount int OUTPUT',@pageCount OUTPUT
SET @recordCount=@pageCount
SET @pageCount=(@pageCount+@pageSize-1)/@pageSize
END

--计算分页显示的TOPN值
DECLARE @TopN varchar(20),@TopN1 varchar(20)
SELECT @TopN=@pageSize,
@TopN1=@pageIndex*@pageSize

--第一页直接显示
IF @pageIndex=1
EXEC(N'SELECT TOP '+@TopN
+N' '+@fields
+N' FROM '+@tableName
+N' '+@sqlWhere
+N' '+@orderField)
ELSE
BEGIN
SELECT @pageIndex=@TopN1,
@sql=N'SELECT @n=@n-1,@s=CASE WHEN @n<'+@TopN
+N' THEN @s+N'',''+QUOTENAME(RTRIM(CAST('+@fieldKey
+N' as varchar(8000))),N'''''''') ELSE N'''' END FROM '+@tableName
+N' '+@sqlWhere
+N' '+@orderField
SET ROWCOUNT @pageIndex
EXEC sp_executesql @sql,
N'@n int,@s nvarchar(4000) OUTPUT',
@pageIndex,@sql OUTPUT
SET ROWCOUNT 0
IF @sql=N''
EXEC(N'SELECT TOP 0'
+N' '+@fields
+N' FROM '+@tableName)
ELSE
BEGIN
SET @sql=STUFF(@sql,1,1,N'')
--执行查询
EXEC(N'SELECT TOP '+@TopN
+N' '+@fields
+N' FROM '+@tableName
+N' WHERE '+@fieldKey
+N' IN('+@sql
+N') '+@orderField)
END
END

posted on 2008-08-18 10:24  nathally  阅读(246)  评论(0)    收藏  举报

导航