SQL Server之游标

部分参考自:https://www.cnblogs.com/knowledgesea/p/3699851.html

一、什么是游标

  游标是取用一组数据并能够一次与一个单独的记录进行交互的方法,可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据。有时,确实不能通过在整个行集中修改或者甚至选取数据来获得所需要的结果,故需要逐一进行处理。

  主要用处(存储过程):

  1. 定位到结果集中的某一行。
  2. 对当前位置的数据进行读写。
  3. 可以对结果集中的数据单独操作,而不是整行执行相同的操作。
  4. 是面向集合的数据库管理系统和面向行的程序设计之间的桥梁。

二、游标的生命周期:

  •   声明游标
  •   打开游标
  •   使用或导航游标
  •   关闭游标
  •   释放游标

三、游标的使用

  1. 声明游标

    语法:

DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]
     [ FORWARD_ONLY | SCROLL ]
     [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
     [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
     [ TYPE_WARNING ]
     FOR select_statement
     [ FOR UPDATE [ OF column_name [ ,...n ] ] ]

    参数说明:

  • cursor_name:游标名称。
  • Local:作用域为局部,只在定义它的批处理,存储过程或触发器中有效。
  • Global:作用域为全局,由连接执行的任何存储过程或批处理中,都可以引用该游标。
  • [Local | Global]:默认为local。
  • Forward_Only:指定游标智能从第一行滚到最后一行。Fetch Next是唯一支持的提取选项。如果在指定Forward_Only是不指定Static、KeySet、Dynamic关键字,默认为Dynamic游标。如果Forward_Only和Scroll没有指定,Static、KeySet、Dynamic游标默认为Scroll,Fast_Forward默认为Forward_Only
  • Static:静态游标
  • KeySet:键集游标
  • Dynamic:动态游标,不支持Absolute提取选项
  • Fast_Forward:指定启用了性能优化的Forward_Only、Read_Only游标。如果指定啦Scroll或For_Update,就不能指定他啦。
  • Read_Only:不能通过游标对数据进行删改。
  • Scroll_Locks:将行读入游标是,锁定这些行,确保删除或更新一定会成功。如果指定啦Fast_Forward或Static,就不能指定他啦。
  • Optimistic:指定如果行自读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不成功。当将行读入游标时,sqlserver不锁定行,它改用timestamp列值的比较结果来确定行读入游标后是否发生了修改,如果表不行timestamp列,它改用校验和值进行确定。如果已修改改行,则尝试进行的定位更新或删除将失败。如果指定啦Fast_Forward,则不能指定他。
  • Type_Warning:指定将游标从所请求的类型隐式转换为另一种类型时向客户端发送警告信息。
  • For Update[of column_name ,....] :定义游标中可更新的列。

  2. 打开游标

    语法:

OPEN [ Global ] cursor_name | cursor_variable_name

  3. 使用和导航游标

    语法:

FETCH
[ [Next|prior|Frist|Last|Absoute n|Relative n ]
from ]
[Global] cursor_name
[into @variable_name[,....]]

    参数说明:

  • Frist:结果集的第一行
  • Prior:当前位置的上一行
  • Next:当前位置的下一行
  • Last:最后一行
  • Absoute n:从游标的第一行开始数,第n行。
  • Relative n:从当前位置数,第n行。
  • Into @variable_name[,...] : 将提取到的数据存放到变量variable_name中。

    例如:FETCH NEXT FROM 游标名称 INTO 变量名1

    意为发出第一个FETCH,即表明要检索特定记录的命令,并将该值放置在哪一个变量中。

    每当提取一行时,就会更新@@FETCH_STATUS,通过检测全局变量@@Fetch_Status的值,获得提取状态信息。
    其可能的值是:
    0 Fetch语句成功——一切正常;
    -1 Fetch语句失败——找不到记录(还没有到达游标的末尾,但自打开游标以后,记录已经被删除);
    -2 Fetch语句失败——这一次是由于已经超出了游标中的最后一条(或者第一条)记录。

  4. 关闭游标

     游标打开后,服务器会专门为游标分配一定的内存空间存放游标操作的数据结果集,同时使用游标也会对某些数据进行封锁。所以游标一旦用过,应及时关闭,避免服务器资源浪费。

CLOSE [ Global ] cursor_name | cursor_variable_name

  5. 释放游标

    删除游标,释放资源

DEALLOCATE [ Global ] cursor_name | cursor_variable_name

四、游标使用实例:

    DECLARE sc_cursor CURSOR
    FOR SELECT Grade FROM SC WHERE Cno=@course_cno
    OPEN sc_cursor
    FETCH NEXT FROM sc_cursor INTO @stu_grade
    IF(@@FETCH_STATUS<>0)
        PRINT ‘没有考该课程的学生‘
    WHILE @@FETCH_STATUS=0
    BEGIN
        IF(@stu_grade<60)
            SET @stu_ccount+=1
        IF(@stu_grade>=60 AND @stu_grade<90)
            SET @stu_bcount+=1
        IF(@stu_grade>=90 AND @stu_grade<=100)
            SET @stu_acount+=1
        FETCH NEXT FROM sc_cursor INTO @stu_grade
    END
    CLOSE sc_cursor
    DEALLOCATE sc_cursor

原文地址:https://www.cnblogs.com/chenloveslife/p/9135749.html

时间: 2024-08-29 19:13:55

SQL Server之游标的相关文章

一个Sql Server 的游标与循环嵌套的存储过程用例

一个Sql Server 的游标与循环嵌套的存储过程用例 准备代码 --创建表 CREATE TABLE everyoneAVG ( ID int primary key identity(1,1), AccNo INT, AVGTime INT, AddTimes INT ); DROP TABLE everyoneAVG; SELECT ID,AccNo AS '用户号',AVGTime/60 AS '平均充值时间间隔(小时)',AddTimes AS '总充值次数' FROM everyo

SQL Server之游标的基础知识

什么是游标: 游标是可以在结果集中上下游动的指针. 游标的作用: --允许定位到结果集中的特定行. --从结果集的当前位置检索一行或多行数据. --支持对结果集中当前位置的行进行修改. 注意:游标虽然很好用,但是如果滥用游标的话,会对程序的性能造成很大影响,使用的时候一定要谨慎啊! 游标的种类: MS SQL SERVER 支持三种类型的游标:Transact_SQL 游标,API 服务器游标和客户游标. (1) Transact_SQL 游标 Transact_SQL 游标是由declare

SQL SERVER CURSOR游标的使用(转载)

一:认识游标 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合. 游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录. 二:游标的基本形式 声明游标:形式1DECLARE cursor_name [INSENSITIVE] [SCROLL] CURS

sql server 的游标

-- sql server 中的游标 --声明游标 /* declare cursorname [insensitive] [scroll] cursor for <select-查询块> [for {read only|update[of<列名>[,...,n]]}] Insensitive 表示把取出来的数据存入一个在tempdb库中创建的临时表,任何通过这个游标进行的操作,都会在这个临时表里进行.所有对基本表的改动都不会在用游标进行的操作中体现出来,不用该关键字,则用户对基本

SQL Server 初识游标

---恢复内容开始--- 游标:游标是一种能从包含多个数据的结果集每次提取一条的机制 游标的特点是: 检索得到的数据集更加灵活 可有针对性的对数据进行操作 拥有对数据进行删除和更新的能力 为何使用游标: 游标提供了一种比较好的解决方案,可以将批操作变成行操作. 游标的步骤  定义游标  打开游标  使用游标  关闭游标  删除游标 代码详解: 1. 定义游标 DECLARE 游标名 [ INSENSITIVE ] [ SCROLL ] CURSOR FOR T-SQL 语句 2. 打开游标 OP

Sql Server 之游标

一般来说,我们通过SQL一般是面向集合进行数据操作,但是游标提供给我们更加强大的功能可以对数据集合进行逐行遍历有选择性的操作处理.当然游标也有其不可避免的缺陷就是:低效和复杂.所以一般正常的操作处理不会选择使用游标进行数据操作. 游标的使用: declare testCur cursor for select ID,gradefrom student where grade <60 or grade is null   ---声明游标 open testCur                  

SQL Server 数据库游标选项

背景: 游标控制服务器端游标的行为,相关的T-SQL如下: declare , open , fetch , close , deallocate. 1. cursor_close_on_commit{on | off}; 如果设置为on 在事务提交时或回滚时会关闭打开的游标, 如果设置为off 游标会在提交事务后继续打开,除非游标定义为static 否则回滚事务会关闭任何游标. alter database studio   set cursor_close_on_commit on;  #

Sql Server利用游标批量清空数据表

先吐槽一下,由于公司要为新客户部署一个全新的系统,然而公司并没有空库,所以只能把正在线上运行的数据库给备份,然后清空相关数据 下面分享一下我在做清空数据库时写的一个批量清空数据表的方法 思路:查询出该库下的所有表 根据表名(系统相关数据表取名都是有规律的)筛选出需要清空的表 下面,上代码 1 USE [DataBase] 2 GO 3 DECLARE @name varchar(50) 4 DECLARE @count int 5 set @count=0 6 DECLARE contact_c

SQL Server 通过游标重新定义单据数据的单据编号

DECLARE @Index INTSET @Index=100DECLARE UpdateCursor  CURSOR  FOR (SELECT DISTINCT AA.Id FROM dbo.表 AA  WHERE  数据过滤条件 )OPEN UpdateCursorDECLARE @DetailId NVARCHAR(36)DECLARE @Name NVARCHAR(36)FETCH NEXT FROM UpdateCursor INTO @DetailIdWHILE @@FETCH_S