• 相关分页Select语句(扩展)


     
    1 存储过程
    create PROCEDURE GetPageDataOutRowPageCount2
    (
    @PageIndex int = 1,--当前页数 
    @PageSize  int = 10,--每页大小
    @RowCount int output,--总行数(传出参数)
    @PageCount int output--总页数(传出参数)
    )
    AS
    begin
     DECLARE @sql NVARCHAR(225),@sqlCount NVARCHAR(225)
     select @RowCount =COUNT(SID),@PageCount=CEILING((COUNT(SID)+0.0)/@PageSize) FROM Students 
     SET @sql='SELECT TOP '+str(@PageSize) +'  FROM Students where SID not in(select top '+str((@PageIndex-1)*@PageSize) +' SID from Students)'
     EXEC(@sql)
    end
    2 Select语句
    select top " + pageSize + " * from Students where SID not in (select top " + (pageIndex - 1) * int.Parse(pageSize) + " SID from Students) 
    3 Select语句
    select * from (select * ,Row_Number()over(order by id) RowNumber from books) t
    where t.RowNumber>=11 and t.RowNumber<=20 
    第n页: (PageIndex-1)*pageSize+1,PageIndex*pageSize
    3.
    方法1:
    适用于 SQL Server 2000/2005
    SELECT TOP 页大小 *
    FROM table1
    WHERE id NOT IN
              (
              
    SELECT TOP 页大小*(-1) id FROM table1 ORDER BY id
              )
    ORDER BY id

    方法2:
    适用于 SQL Server 2000/2005
    SELECT TOP 页大小 *
    FROM table1
    WHERE id >
              (
              
    SELECT ISNULL(MAX(id),0
              FROM 
                    (
                   
    SELECT TOP 页大小*(-1) id FROM table1 ORDER BY id
                    ) 
    A
              )
    ORDER BY id

    方法3:
    适用于 SQL Server 2005

    SELECT TOP 页大小 * 
    FROM 
            (
            
    SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
            ) A
    WHERE RowNumber > 页大小*(页数-1)


    说明,页大小:每页的行数;页数:第几页。使用时,请把“页大小”和“页大小*(页数-1)”替换成数字。

    其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
    建议优化的时候,加上主键和索引,查询效率会提高。

    通过SQL 查询分析器,显示比较:我的结论是:
    分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
    分页方案一:(利用Not In和SELECT TOP分页)   效率次之,需要拼接SQL语句
    分页方案三:(利用SQL的游标存储过程分页)    效率最差,但是最为通用

    ------------------------------------------------------------------------------事务--------------------------------------------------------------------------------

    SQL事务
     
    一、事务概念
        事务是一种机制、是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。因此事务是一个不可分割的工作逻辑单元。在数据库 系统上执行并发操作时事务是作为最小的控制单元来使用的。这特别适用于多用户同时操作的数据通信系统。例如:订票、银行、保险公司以及证券交易系统等。
     
    二、事务属性
    事务4大属性:
    1   原子性(Atomicity):事务是一个完整的操作。
    2   一致性(Consistency):当事务完成时,数据必须处于一致状态。
    3   隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的。
    4   持久性(Durability):事务完成后,它对于系统的影响是永久性的。
     
    三、创建事务
    T-SQL中管理事务的语句:
    1 开始事务: begin transaction
    2 提交事务:commit transaction
    3 回滚事务: rollback transaction
     
    事务分类:
    1 显式事务:用begin transaction明确指定事务的开始。
    2 隐性事务:打开隐性事务:set implicit_transactions on,当以隐性事务模式操作时,SQL Servler将在提交或回滚事务后自动启动新事务。无法描述事务的开始,只需要提交或回滚事务。
    3 自动提交事务:SQL Server的默认模式,它将每条单独的T-SQL语句视为一个事务。如果成功执行,则自动提交,否则回滚。
     
    示例:张三转800元到李四帐户上。
      use stuDB
    go
    --创建帐户表bank--
    if exists(select* from sysobjects where name='bank')
        drop table bank
    create table bank
    (
        customerName char(10),    --顾客姓名
        currentMoney money        --当前余额
    )
    go
    /**//*--添加约束,帐户不能少于元--*/
    alter table bank add
            constraint CK_currentMoney check(currentMoney>=1)
    /**//*--插入测试数据--*/
    insert into bank(customerName,currentMoney)
    select '张三',1000 union
    select '李四',1

    select * from bank
    go

    /**//*--使用事务--*/
    use stuDB
    go
    --恢复原来的数据
    --update bank set currentMoney=currentMoney-1000 where customerName='李'
    set nocount on    --不显示受影响的行数
    print '查看转帐事务前的余额'
    select * from bank
    go

    /**//*--开始事务--*/
    begin transaction
    declare @errorSum int    --定义变量,用于累计事务执行过程中的错误
    /**//*--转帐--*/
    update bank set currentMoney=currentMoney-800 where customerName='张三'
    set @errorSum=@errorSum+@@error    --累计是否有错误
    update bank set currentMoney=currentMoney+800 where customerName='李四'
    set @errorSum=@errorSum+@@error --累计是否有错误

    print '查看转帐事务过程中的余额'
    select * from bank

    /**//*--根据是否有错误,确定事务是提交还是回滚--*/
    if @errorSum>0
        begin
            print '交易失败,回滚事务.'
            rollback transaction
        end
    else
        begin
            print '交易成功,提交事务,写入硬盘,永久保存!'
            commit transaction
        end
    go

    print '查看转帐后的余额'
    select * from bank
    go

  • 相关阅读:
    Metronic最优秀的基于Bootstrap的响应式网站模版
    SMINT:单页网站的免費jQuery插件
    不做全栈开发工程师
    《劲道》课程笔记——教练对话
    windows 7环境下配置oracle 11g 客户端
    jsp+servlet+javabean (MVC)分页
    解析java中 hashcode()
    BeanUtils操作
    Dom4jApp.java 解析和创建XML
    dom4j
  • 原文地址:https://www.cnblogs.com/guozhe/p/2455451.html
Copyright © 2020-2023  润新知