• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    针对SQL 2000 的分页存储过程代码分享
    POST TIME:2021-10-18 18:53
    复制代码 代码如下:

    ----------------------------------------------------
    --针对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
    您可能感兴趣的文章:
    • 深入sql server 2005 万能分页存储过程的详解
    • 基于Sql Server通用分页存储过程的解决方法
    • SQL Server 2005通用分页存储过程及多表联接应用
    • 分页存储过程(三)在sqlserver中打造更加准确的分页结果
    • 分页存储过程(二)在sqlserver中返回更加准确的分页结果
    • sqlserver 千万数量级分页存储过程代码
    • 2分法分页存储过程脚本实例
    上一篇:MySQL 多表查询实现分析
    下一篇:sql 查询本年、本月、本日记录的语句,附SQL日期函数
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信