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 stuDBgo--创建帐户表bank--if exists(select* from sysobjects where name='bank')    drop table bankcreate 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 unionselect '李四',1
select * from bankgo
/**//*--使用事务--*/use stuDBgo--恢复原来的数据--update bank set currentMoney=currentMoney-1000 where customerName='李'set nocount on    --不显示受影响的行数print '查看转帐事务前的余额'select * from bankgo
/**//*--开始事务--*/begin transactiondeclare @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    endelse    begin        print '交易成功,提交事务,写入硬盘,永久保存!'        commit transaction    endgo
print '查看转帐后的余额'select * from bankgo