针对SQL 2000 的分页存储过程代码分享

复制代码 代码如下:

----------------------------------------------------

--针对SQL 2000 的分页存储过程

--Time:2008-9-25

----------------------------------------------------

ALTER PROCEDURE [dbo].[uoSp_RecordPager]

--要分页显示的表名,可多表连查,但不能使用别名。

--例:uo_Article LEFT JOIN uo_ArticleClass ON uo_Article.AClassID=uo_ArticleClass.ID

@Table_info varchar(100),

--用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段

@field_id nvarchar(1000),

--要显示的页码

@CurrentPage int=1,

--每页的大小(记录数)

@PageSize int=10,

--以逗号分隔的要显示的字段列表,如果不指定,则为*。但多表联查时,若有同名字段,则必须显示指定要查的字段。

--例:uo_Article.*,uo_ArticleClass.ClassName

@Field_info nvarchar(1000),

--以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC 用于指定排序顺序

@Field_Order nvarchar(1000)= ' ',

--查询条件

@otherwhere nvarchar(1000)= ' ',

@RecordCount int OUTPUT, --总行数

@PageCount int OUTPUT, --总页数

@SQLSTR nvarchar(2000) output

AS

SET NOCOUNT ON

--分页字段检查

IF ISNULL(@field_id,N' ')= ' '

BEGIN

RAISERROR(N'分页处理需要主键(或者惟一键) ',1,16)

RETURN

END

--其他参数检查及规范

IF ISNULL(@PageSize,0) <1 SET @PageSize=10

IF ISNULL(@Field_info,N' ')=N' ' SET @Field_info=N'* '

IF ISNULL(@Field_Order,N' ')=N' '

SET @Field_Order=N' '

ELSE

SET @Field_Order=N'ORDER BY '+LTRIM(@Field_Order)

IF ISNULL(@otherwhere,N' ')=N' '

SET @otherwhere=N' '

ELSE

SET @otherwhere=N' WHERE ('+@otherwhere+N') '

--计算@RecordCount

declare @sqlt nvarchar(1000)

set @sqlt = 'SELECT @RecordCount = COUNT(' + @Field_id + ') FROM ' + @Table_Info + @otherwhere

exec sp_executesql @sqlt,N'@RecordCount int output',@RecordCount output

--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)

IF @PageCount IS NULL

BEGIN

DECLARE @sql nvarchar(4000)

SET @sql=N'SELECT @PageCount=COUNT(*) '

+N' FROM '+@Table_info

+N' '+@otherwhere

EXEC sp_executesql @sql,N'@PageCount int OUTPUT ',@PageCount OUTPUT

SET @PageCount=(@PageCount+@PageSize-1)/@PageSize

END

IF ISNULL(@CurrentPage,0) <1 SET @CurrentPage=1

IF @CurrentPage > @PageCount and @PageCount>0 SET @CurrentPage=@PageCount

--第一页直接显示

IF @CurrentPage = 1

BEGIN

SET @SQLSTR = N'SELECT TOP ' + str(@PageSize) +N' '+@Field_info +N' FROM '+@Table_info +N' '+@otherwhere +N' '+@Field_Order

--PRINT @SQLSTR

EXEC(@SQLSTR)

END

ELSE

BEGIN

----------------------------------------------------

--获取第一个表的表名

DECLARE @FirstTableName varchar(20)

SET @FirstTableName = @Table_info

IF CHARINDEX(N',',@FirstTableName)>0 OR CHARINDEX(N'.',@FirstTableName)> 0 OR CHARINDEX(N' ',@FirstTableName)> 0

BEGIN

WHILE CHARINDEX(N',',@FirstTableName)> 0

SELECT @FirstTableName=LEFT(@FirstTableName,CHARINDEX(N',',@FirstTableName)-1)

WHILE CHARINDEX(N'.',@FirstTableName)> 0

SELECT @FirstTableName=LEFT(@FirstTableName,CHARINDEX(N'.',@FirstTableName)-1)

WHILE CHARINDEX(N' ',@FirstTableName)> 0

SELECT @FirstTableName=LEFT(@FirstTableName,CHARINDEX(N' ',@FirstTableName)-1)

END

--构造SQL语句

SET @SQLSTR = N'SELECT * FROM ('

+ N' SELECT TOP '+STR(@PageSize*@CurrentPage) +N' '+ @Field_info + N' FROM '+@Table_info +N' '+@otherwhere +N' '+@Field_Order

+ N') '+@FirstTableName+N' WHERE '+@field_id+N' NOT IN ('

+ N' SELECT TOP '+STR(@PageSize*(@CurrentPage-1))+N' '+ @field_id + N' FROM '+@Table_info +N' '+@otherwhere +N' '+@Field_Order

+ N') '

+ N' '+@Field_Order

EXEC(@SQLSTR)

----------------------------------------------------

END

时间: 2024-09-21 11:38:26

针对SQL 2000 的分页存储过程代码分享的相关文章

针对SQL 2000 的分页存储过程代码分享_MsSql

复制代码 代码如下: ---------------------------------------------------- --针对SQL 2000 的分页存储过程 --Time:2008-9-25 ---------------------------------------------------- ALTER PROCEDURE [dbo].[uoSp_RecordPager] --要分页显示的表名,可多表连查,但不能使用别名. --例:uo_Article LEFT JOIN uo_

sql server 2005分页存储过程和sql server 2000分页存储过程

 sql server 2005分页存储过程和sql server 2000分页存储过程,sql 2005的分页存储过程分3个版本,一个是没有优化过的,一个是优化过的,最后一个支持jion的,sql2000的分页存储过程,也可以运行在sql2005上,但是性能没有sql2005的版本好. USE [svnhost] GO /****** 对象:  StoredProcedure [dbo].[up_Page2005]    脚本日期: 05/21/2008 11:27:05 ******/ SE

两款sql 分页存储过程代码

文章收藏了两款sql 分页存储过程代码,这二款存储过程是二款高效分页存储过程代码,如果你觉得自己写的语句不够,强的话,可以利用我们现成的高效分页存储过程实例代码. create procedure pages @tablenames varchar(200), --表名,可以是多个表,但不能用别名 @primarykey varchar(100), --主键,可以为空,但@order为空时该值不能为空 @fields varchar(800), --要取出的字段,可以是多个表的字段,可以为空,为

基于Sql Server通用分页存储过程的解决方法_MsSql

sql server2000分页方式很多,效率吗  当到达10万级以上就有些吃力了,这里暂时不例出来了 sql server2005以上就有了row_number 也是一大进步,详情如下参考 复制代码 代码如下: Sql Server2005通用分页存储过程 CREATE PROCEDURE [dbo].[Common_GetPagedList](@TableName nvarchar(100), --表名@ColumnNames nvarchar(1000) = '*', --字段名集合(全部

.NET分页存储过程代码及使用

最近需要做个论坛,其中用到了分页,如果把整表的数据都查询出来未免小题大做,而且还影响速度 ,所以百度了并私有化了一个分页存储过程,实现了调用. 好了,废话不多说,贴出代码: /**** 使用帮助 首先查询表总行数,再查询分页数据 查询行数传入参数:@doCount,@tblName 查询分页传入参数:@tblName,@PageSize,@PageIndex,@fldName *以上不带查询条件的查询 带条件的加参数:@strWhere *分页查询可以使用排序 参数:@OrderType ***

1&gt;通用分页存储过程代码及调用

Java代码   /*****************************************************  MySQL分页存储过程  吴剑 2009-07-02    *****************************************************/   DROP PROCEDURE IF EXISTS pr_pager;   CREATE PROCEDURE pr_pager(       IN     p_table_name        V

sqlserver 千万数量级分页存储过程代码_MsSql

复制代码 代码如下: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go Create PROCEDURE [dbo].[SP_Pagination] /**//* *************************************************************** ** 千万数量级分页存储过程 ** *************************************************************** 参

sqlserver 千万数量级分页存储过程代码

复制代码 代码如下: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go Create PROCEDURE [dbo].[SP_Pagination] /**//* *************************************************************** ** 千万数量级分页存储过程 ** *************************************************************** 参

用XML和SQL 2000来管理存储过程调用_XML/RSS

创建多个带有不同参数的存储过程(stored procedure)来完成同一个任务总是一个很大的负担.利用XML字符串向你的存储过程发送参数就能够简化这个任务:这也让COM组件的设计更简单.  实现这个目的的方法是将你的参数作为一个XML字符串来传递,并剖析XML来取回你所需要的数据,然后继续实现你所需要集成的功能.你不仅可以通过XML来获取一些参数,你还可以对XML所创建的DOM文档运行查询,以此来封装多个存储过程.我会提供一些例子,告诉你如果实现这个目的,并简要地描述每个例子. 在本例里,为