SQL 单表分页存储过程和单表多字段排序和任意字段分页存储过程

 
第一种:单表多字段排序分页存储过程
 
 
 
--支持单表多字段查询,多字段排序

create PROCEDURE [dbo].[UP_GetByPageFiledOrder]
(
 @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 @SqlString =‘select * from ‘ + @SqlString + ‘) as t where rowId between ‘ + ltrim(str(@StartRecord)) + ‘ and ‘ +  ltrim(str(@EndRecord));
    Exec(@SqlString)
END
 
 
下面是调用存储过程
--exec [PROCE_SQL2005PAGECHANGE] ‘T_ScInfo‘,‘*‘,‘by2 desc,addtime desc‘,‘ by1=4 and state = 1 ‘,‘2‘,‘3‘,‘‘
 
第二种:单表效率最高的分页存储过程
动软分页存储过程
 
ALTER PROCEDURE [dbo].[UP_GetRecordByPage]
    @tblName      varchar(255),       -- 表名
    @fldName      varchar(255),       -- 主键字段名
    @PageSize     int = 10,           -- 页尺寸
    @PageIndex    int = 1,            -- 页码
    @IsReCount    bit = 0,            -- 返回记录总数, 非0 值则返回
    @OrderType    bit = 0,            -- 设置排序类型, 非0 值则降序
    @strWhere     varchar(1000) = ‘‘ -- 查询条件(注意: 不要加where)
AS

declare @strSQL   varchar(6000)       -- 主语句
declare @strTmp   varchar(1000)        -- 临时变量(查询条件过长时可能会出错,可修改为)
declare @strOrder varchar(400)        -- 排序类型

if @OrderType != 0
begin
    set @strTmp = ‘<(select min‘
    set @strOrder = ‘ order by [‘ + @fldName +‘] desc‘
end
else
begin
    set @strTmp = ‘>(select max‘
    set @strOrder = ‘ order by [‘ + @fldName +‘] asc‘
end

set @strSQL = ‘select top ‘ + str(@PageSize) + ‘ * from [‘
    + @tblName + ‘] where [‘ + @fldName + ‘]‘ + @strTmp + ‘([‘
    + @fldName + ‘]) from (select top ‘ + str((@PageIndex-1)*@PageSize) + ‘ [‘
    + @fldName + ‘] from [‘ + @tblName + ‘]‘ + @strOrder + ‘) as tblTmp)‘
    + @strOrder

if @strWhere != ‘‘
    set @strSQL = ‘select top ‘ + str(@PageSize) + ‘ * from [‘
        + @tblName + ‘] where [‘ + @fldName + ‘]‘ + @strTmp + ‘([‘
        + @fldName + ‘]) from (select top ‘ + str((@PageIndex-1)*@PageSize) + ‘ [‘
        + @fldName + ‘] from [‘ + @tblName + ‘] where ‘ + @strWhere + ‘ ‘
        + @strOrder + ‘) as tblTmp) and ‘ + @strWhere + ‘ ‘ + @strOrder

if @PageIndex = 1
begin
    set @strTmp =‘‘
    if @strWhere != ‘‘
        set @strTmp = ‘ where ‘ + @strWhere

    set @strSQL = ‘select top ‘ + str(@PageSize) + ‘ * from [‘
        + @tblName + ‘]‘ + @strTmp + ‘ ‘ + @strOrder
end

if @IsReCount != 0
    set @strSQL = ‘select count(*) as Total from [‘ + @tblName + ‘]‘+‘ where ‘ + @strWhere

exec (@strSQL)
 
 
时间: 2024-10-24 07:01:42

SQL 单表分页存储过程和单表多字段排序和任意字段分页存储过程的相关文章

sql 多个字段排序,头一个字段排序完,再对第二个字段进行排序(以此类推)

现根据num排序,num数字相同的根据时间进行排序,都是降序DESC SELECT * FROM counts ORDER BY num DESC,create_time DESC

sql server 2000 单主键高效分页存储过程 (支持多字段排序)

sql server 2000 单主键高效分页存储过程 (支持多字段排序) Create PROC P_viewPage             /*              nzperfect [no_mIss] 高效通用分页存储过程(双向检索) 2007.5.7  QQ:34813284              敬告:适用于单一主键或存在唯一值列的表或视图              ps:Sql语句为8000字节,调用时请注意传入参数及sql总长度不要超过指定范围            

python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_demo.settings") import django django.setup() # 启动Django项目 from app01 import models #返回QuerySet对象的方法: r

sql server相邻表记录交换(单双两两交换)

在博客园的博问中看到了一个这样的提问:一个表中有id和name两个字段,id是连续非空不重复的,想要交换相邻表记录的name值(单双两两交换). 另外,如果最后的单独行没有对应的下一行匹配记录的话,就不更新最后的单独行记录. 觉得有点意思,就试着实现一下(SQL Server),并记录下来. 创建一个diosos表. -- 如果表存在,就删除表 if object_id(N'diosos', N'U') is not null drop table diosos; -- 创建表 create t

sqlserver2000 存储过程分页 -只有一张表

从网上找的,采用了游标进行了存储过程分页,但是有一个问题,就是有两张表,第一张表是空的,而第二张表才是真正的有数据的. 现在修改了该存储过程,使其只生成一张表. create procedure [dbo].[Pr_QueryByPage] @sqlstr nvarchar(4000), --查询sql @currentpage int, --第页记录条数 @pagesize int, --每页显示记录 @tablename varchar(100) --表名as set nocount on

单表查询: where group by 分组 having distinct 去重 order by 排序 limit 多表查询 子查询 连表查询

今日内容 表查询 单表查询: where group by 分组 having distinct 去重 order by 排序 limit 多表查询 子查询 连表查询 单表查询 前期表准备 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex enum('male','female') not null default 'male', #大部分是男的 age int(3) u

MySQL单表的CRUD及多表查询

数据库表的增删改查操作: 增.删.改 查: 单表查询 简单查询.where约束.group by分组.聚合查询.having过滤.order by排序.limit限制.正则匹配 多表查询 连表查询:交叉查询.>內连查询.左外连接查询.右外连接查询.全外链接查询.连接结果筛选查询 子查询 :带关键字in的子查询.带比较运算符的子查询.带关键字exists的布尔判断结果查询 表记录增删改总结: MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包

表单(二)多个表单项的动态校验总结

任务目的 加强对JavaScript的掌握 熟悉常用表单处理逻辑 任务描述 如示例图中所示,基于上一个任务,在页面中添加多个表单 要求: 表单获得焦点时,下方显示表单填写规则 表单失去焦点时校验表单内容 校验结果正确时,表单边框显示绿色,并在下方显示验证通过的描述文字 校验结果错误时,表单边框显示红色,并在下方显示验证错误的描述文字 点击提交按钮时,对页面中所有输入进行校验,校验结果显示方式同上.若所有表单校验通过,弹窗显示"提交成功",否则显示"提交失败" 任务注

表单的属性和方法, 获取表单和表单的元素, 验证表单

表单的属性和方法 一. 表单字段的属性(id/name/value/form),这里用value属性来举例 上面的form属性代表获取表单字段的父级表单对象 1. 属性的获取         console.log(document.myform.username.value); 2. 属性的设置            document.myform.username.value="123"; 3. 获取表单字段的父级表单对象 console.log(document.myform.u