mssql sqlserver 只进游标和滚动游标说明


摘要:
下文讲述sqlserver中只进游标和滚动游标,如下所示:
实验环境:sql server 2008 R2


默认情况下,创建游标为只进游标。
只进游标:从第一行依次读取至最后一行,只可使用fetch next依次读取下一行,不支持跳跃读取
不支持向后读取。

只进游标的缺点:当游标读取过的数据被update 操作过,此时由于游标不支持向后读取,所以无法重新读取数据
,获取修改后的值。

 ---定义游标需使用的临时变量
     declare @a int
     declare @b varchar(60)
      
     ---定义只进游标,并将游标赋值
     declare testCursor cursor  fast_forward for 
        select a,b from test 
        order by a asc 
        for read only 
    
     --打开游标
     open  testCursor 
     ---循环游标 
     while 0=0 
     begin
      ---读取游标中的数据
      fetch next   ---读取下一行
          from testCursor
       into @a,@b 
      
       if @@fetch_status <> 0 
        begin 
           break   ---退出while 循环
        end 
         ---输出或操作变量
         print @a 
         print @b 
      end 

     close testCursor              ---关闭游标
     deallocate testCursor       ---释放游标

滚动游标:
滚动游标同只进游标最大的不同之处在于,滚动可以跳跃或指定行进行游标中数据的获取,
滚动游标支持多种fetch读取方式,如下表所示:
滚动游标:
滚动游标的创建方法,在cursor前加入”scroll”关键字即可

     ---定义滚动游标
     declare testCursor   scroll  cursor for 
        select a,b from test 
        order by a asc 
        for read only  
fetch next

读取当前行的下一行
fetch prior

读取当前行的前一行
fetch first

读取游标中的第一行
fetch last

读取游标中的最后一行
fetch absolute n(n为一个整数常量)

n=0 不返回任何行
n >0 返回从游标中第n行
n<0 返回从游标尾部开始的第n行
fetch relative n(n为一个整数常量)

n=0 不返回任何行
n >0 返回从当前行开始的第n行
n<0 返回从当前行开始的之前的第n行

 ---定义游标需使用的临时变量
     declare @a int
     declare @b varchar(60)
      
     ---定义滚动游标,并将游标赋值
     declare testCursor  scroll cursor  for 
        select a,b from test 
        order by a asc 
        for read only 
    
     --打开游标
     open  testCursor 
      
      fetch next   ---读取游标中的下一行
          from testCursor
       into @a,@b 
       ---输出变量 
         print @a 
         print @b 


      fetch last    ---读取游标中的最后一行
          from testCursor   into @a,@b 
       ---输出变量 
         print @a 
         print @b 


      fetch prior    ---读取游标当前行的前一行
          from testCursor   into @a,@b 
       ---输出变量 
         print @a 
         print @b 


    fetch absolute 2     ---读取游标中的第二行
          from testCursor   into @a,@b 
      
     
    fetch relative 2     ---读取当前行的第二行
          from testCursor   into @a,@b  



     close testCursor              ---关闭游标
     deallocate testCursor       ---释放游标

mssql sqlserver 游标创建的基础例子


摘要:
下文讲述游标创建的例子,如下所示:
实验环境:sql server 2008 R2



1.游标的应用场景

在sql脚本编写中,游标主要应用于存储过程和触发器中,创建游标的步骤如下所示:
1.申明临时变量,用于游标执行中临时存储数据
2.什么一个游标,并定义游标属性 declare cursor
3.打开一个游标,并把select结果集放入游标中
4.使用fetich into语句获取游标中的单个行,并将行中的数据放入”1 中申请的变量中”
5.游标使用完毕后,使用close关闭游标,并释放游标所占用的资源


2.游标的举例应用

    ---创建一个存储过程,依次读取一张数据表中的数据
    create proc pr_test
    as 
      ---定义游标需使用的临时变量
     declare @a int
     declare @b varchar(60)
      
     ---定义只读游标,并将游标赋值
     declare testCursor cursor for 
        select a,b from test 
        order by a asc 
        for read only 
    
     --打开游标
     open  testCursor 
     ---循环游标 
     while 0=0 
     begin
      ---读取游标中的数据
      fetch next   ---读取下一行
          from testCursor
       into @a,@b 
      
       if @@fetch_status <> 0 
        begin 
           break   ---退出while 循环
        end 
         ---输出或操作变量
         print @a 
         print @b 
      end 

     close testCursor              ---关闭游标
     deallocate testCursor       ---释放游标

在以上的语句中游标的名称被放入declare 和cursor关键字之间
for关键字后面为对游标进行赋值,在对游标进行赋值的select 语句中不能存在以下关键字

compute、compute by 、for browse 、into

fetch next 为读取行数据,第一次读取时,获取第一行数据,依次向下获取数据,
@@fetch_status 等于0代表读取成功
@@fetch_status 等于-1代表读取失败或行不在结果集中
@@fetch_status 等于-2代表读取的行不存在
游标操作完毕后,应立即关闭游标,当我们没有使用”deallocate”时,我们可以通过open再次重新读取
游标
如游标不需要使用时,可使用deallocate永久释放游标

---游标另类定义方法
   declare testCursor  cursor      ---定义游标
      set  testCursor =cursor for  ---使用set对游标进行赋值
        select a,b from test 
        order by a asc 
        for read only 
  


游标的作用域

我们可以通过在cursor关键字后使用local global关键字来指定游标的作用域
local的作用域为局部,(缺省情况下为local),对当前过程的范围有效
global作用域为全局,对当前连接都有效

mssql sqlserver truncate table 关键字的原理分享


摘要:
下文讲述truncate table 关键字的原理,如下所示:
实验环境:sql server 2008 R2



truncate 关键字简介

truncate 关键字功能:truncate关键字是删除数据表中所有内容的sql脚本。

  ---truncate table 用法如下:
 truncate table [表名]

truncate table 删除表内容的速度非常快,效率非常高,在功能上truncate table同不带where 条件的delete语句功能相同,
二者都是删除表中全部行,
————————————————
truncate table 同delete关键字对比
1. truncate table 比delete 速度快,truncate 占用少量的事务日志
2. 由于truncate table 产生较少的事务日志,所以此操作需谨慎,一旦出错,将不可逆转
3. truncate table将会重置标识列
4.对于存在“外键”的表,无法使用truncate table操作
5.truncate table无法产生日志,所以此操作不会触发delete触发器
————————————————

truncate table 删除数据的原理:
truncate table 删除数据的原因,是将数据表中数据所对应的数据页信息关联释放掉,并且事务日志中只记载页释放的信息

举例说明

 create table [maomao]
(keyId int identity,
 info varchar(30))
 go
 
 insert into [maomao]
 (info)values(N'sql教程'),
 ('sqlblog'),(N'sql爱好者')
 go
 
 

---表所在页查看
DBCC IND('test',maomao,-1)
go

truncate table maomao
go
---表所在页查看
DBCC IND('test',maomao,-1)
go

drop table maomao