问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

SQL Server中的游标是什么意思?

发布网友 发布时间:2022-04-29 21:04

我来回答

6个回答

懂视网 时间:2022-04-30 01:26

  1.   现存系统有一些游标,我们查询必须通过游标来实现。
  2.   作用一个备用方式,当使用while、子查询,临时表,表变量,自建函数或其他方式仍然无法实现某些查询的时候,可以使用游标实现。

  游标的定义语法:

 
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 ] ] ]
[;]
 

T-SQL中游标的生命周期以及实现

  1、定义一个游标   在T-SQL中,定义一个游标可以使非常简单,也可以相对复杂,这主要取决于游标的参数。而游标的参数设置取决于你对游标原理的了解程度。   游标其实可以理解成一个定义在特定数据集上的指针,我们可以控制这个指针遍历数据集,或者仅仅是指向特定的行,所以欧标是定义在以SELECT开始的数据集上的。

  技术分享

   游标分为游标类型和游标变量,对于游标变量来说,遵循T-SQL变量的定义方法。游标变量支持两种方式赋值,定义时赋值和先定义后赋值,定义游标变量像定义其他局部变量一样,在游标前加”@”,注意,如果定义全局的游标,只支持定义时直接赋值,并且不能在游标名称前面加“@”,两种定义方式如下:

 
  --定义后直接复制
  DECLARE test_Cursor CURSOR FOR
  SELECT * FROM Person

  --先定义后复制
  DECLARE @TEST_Cursor2 CURSOR
  SET @test_Cursor2 = CURSOR FOR
  SELECT * FROM Person
 

  参数解释:

  1、LOCAL和GLOBAL二选一

 
--全局游标,跨GLOBAL
DECLARE test_Cursor CURSOR GLOBAL FOR 
SELECT * FROM Person

--局部游标,跨LOCAL
DECLARE test_Cursor2 CURSOR LOCAL FOR
SELECT * FROM Person

--用GO结束上面的作用域
GO
OPEN test_Cursor
OPEN test_Cursor2 --此行代码报错,报游标不存在,因此可以理解局部游标不跨批处理,批处理结束后,将被隐式释放,无法在其他批处理中调用
 

   如果不指定游标作用域,默认作用域为GLOBAL。

   2、FORWARD_ONLY 和 SCROLL 二选一

   FORWARD_ONLY意味着游标只能从数据集开始向数据集结束的方向读取,FETCH NEXT是唯一的选项,而SCROLL支持游标在定义的数据集中向任何方向,或任何位置移动。

 
--不加参数,默认为Forward_Only
DECLARE test_Cursor CURSOR FOR
SELECT * FROM Person
--加Forward_Only
DECLARE test_Cursor2 CURSOR FORWARD_ONLY FOR
SELECT * FROM Person
--加SCROLL
DECLARE test_Cursor3 CURSOR SCROLL FOR
SELECT * FROM Person

OPEN test_Cursor
OPEN test_Cursor2
OPEN test_Cursor3
FETCH LAST FROM test_Cursor  --报错 fetch: 提取类型 last 不能与只进游标一起使用。
FETCH LAST FROM test_Cursor2   --报错 fetch: 提取类型 last 不能与只进游标一起使用。
FETCH LAST FROM test_Cursor3       --正确执行
 

  3、STATIC KEYSET DYNAMIC 和 FAST_FORWARD 四选一

  这四个关键字是游标所在数据集所反映的表数据和游标读取出数据的关系

  • STATIC:当游标被建立时,将会创建FOR后面的SELECT语句所包含数据集的副本存入tempdb数据库中,任何对于底层表内数据的更改不会影响到游标内容。
  • DYNAMIC:和STATIC完全相反的选项,当底层数据库更改时,游标的内容也会随之得到反映,在下一次fecth中,数据内容会随之更爱。
  • KEYSET:可以理解为介于STATIC和DYNAMIC的折中方案,将游标所在结果集的唯一能确定每一行的主键存入tempdb,当结果集中任何行改变或者删除时,@@FETCH_STATUS会为-2,KEYSET无法探测新加入的数据。
  • FAST_FORWARD:可以理解为FORWARD_ONLY的优化版本。FORWARD_ONLY执行的是静态计划,而FAST_FORWARD是根据情况进行选择采用动态计划还是静态计划,大多数情况下FAST_FORWARD要比FORWARD_ONLY性能略好。
  •   4、READ_ONLY SCROLL_LOCKS OPTIMISTIC 三选一

  • READ_ONLY:意味着声明的游标只能读取数据,游标不能做任何更新操作
  • SCROLL_LOCKS:是另一种极端,将读入游标的所有数据进行锁定,防止其他程序进行更改,以确保更新的绝对成功。
  • OPTIMISTIC:相对比较好的一个选择,OPTIMISTIC不锁定任何数据,当需要在游标中更新数据时,如果底层表数据更新,则游标内数据更新不成功,如果,底层表数据未更新,则游标内表数据可以更新。
  • 打开游标                                                                                                         

      当定义完游标后,游标需要打开后使用,只需一行代码便可打开游标:

      OPEN test_Cursor

      注意,当全局游标和局部游标变量重名时,默认会打开局部变量游标。

    使用游标                                                                                                           

      游标的使用分为两部分,一部分是操作游标在数据集内的指向,另一部分是将游标所指向的行的部分或全部内容进行操作。 只有支持6中移动宣杭,分别为第一行(FIRST),最后一行(LAST),下一行(NEXT),上一行(PRIOR),直接跳到某行(ABSOLUTE(n)),相对于目前跳几行(RELATIVE(n))。

      例如:

     
      DECLARE test_Cursor CURSOR SCROLL FOR
      SELECT name FROM Person
    
      OPEN test_Cursor
      DECLARE @c NVARCHAR(10)
    
      --取下一行
      FETCH NEXT FROM test_Cursor INTO @c
      PRINT @c
      --取最后一行
      FETCH LAST FROM test_Cursor INTO @c
      PRINT @c
      --取第一行
      FETCH FIRST FROM test_Cursor INTO @c
      PRINT @c
      --取上一行
      FETCH PRIOR FROM test_Cursor INTO @c
      PRINT @c
      --取第三行
      FETCH ABSOLUTE 3 FROM test_Cursor INTO @c
      PRINT @c
      --取相对目前来说上一行
      FETCH RELATIVE -1 FROM test_Cursor INTO @c
      PRINT @c
     

       对于未指定SCROLL选项的游标来说(未指定是只进游标),只支持NEXT取值。

       游标经常会和全局变量@@FETCH_STATUS与WHILE循环来共同使用,以达到遍历游标所在数据集的目的。

      例如:

     
      DECLARE test_Cursor CURSOR SCROLL FOR
      SELECT id,name FROM Person
    
      OPEN test_Cursor
      DECLARE @id int
      DECLARE @name NVARCHAR(10)
    
      WHILE @@FETCH_STATUS = 0
      BEGIN
      PRINT @id
      PRINT @nem
      FETCH NEXT FROM test_Cursor INTO @id,@name
      END
      CLOSE test_Cursor
      DEALLOCATE test_Cursor
     

    关闭游标                                                                                                           

      在游标使用完之后,一定要记得关闭,只需要一行代码:CLOSE+游标名称

      CLOSE test_Cursor

    释放游标                                                                                                          

    当游标不再需要被使用后,释放游标,只需要一行代码:DEALLOCATE+游标名称

      DEALLOCATE test_Cursor

    对于游标一些优化建议                                                                                         

  • 如果能不用游标,尽量不要使用游标
  • 用完用完之后一定要关闭和释放
  • 尽量不要在大量数据上定义游标
  • 尽量不要使用游标上更新数据
  • 尽量不要使用insensitive, static和keyset这些参数定义游标
  • 如果可以,尽量使用FAST_FORWARD关键字定义游标
  • 如果只对数据进行读取,当读取时只用到FETCH NEXT选项,则最好使用FORWARD_ONLY参数
  •   到生命周期来谈游标。游标是非常邪恶的一种存在,使用游标经常会比使用面向集合的方法慢2-3倍,当游标定义在大数据量时,这个比例还会增加。如果可能,尽量使用while,子查询,临时表,函数,表变量等来替代游标,记住,游标永远只是你最后无奈之下的选择,而不是首选。

    T-SQL游标

    标签:

    热心网友 时间:2022-04-29 22:34

    ①概念:游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理
    ②特点:游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制
    ③作用:当需要逐条读取记录时可以用游标,相当于for循环,一次获取一条记录进行操作。当一组记录没有id字段时,此时用for循环不能够实现,而游标可以解决此问题(注:当数据量很大的时候不建议使用游标,因为游标处理处理数据比较慢)

    热心网友 时间:2022-04-29 23:52

    SQL Server中的游标相当于循环

    使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL
    server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。

    . 如何使用游标:
        
    一般地,使用游标都遵循下列的常规步骤:
          (1)
    声明游标。把游标与T-SQL语句的结果集联系起来。
          (2)
    打开游标。
          (3)
    使用游标操作数据。

          (4) 关闭游标。

     下列为游标SQL:

    DECLARE Testcursor cursor     
    FOR SELECT * FROM test
    OPEN
    Testcursor               
    FETCH
    NEXT from Testcursor    
    WHILE @@FETCH_STATUS =
    0    
    BEGIN

       --这里就是处理逻辑所在
       FETCH NEXT from
    Testcursor  
    END

    CLOSE
    Testcursor              
    DEALLOCATE
    Testcursor   

    热心网友 时间:2022-04-30 01:26

    游标用于按顺序遍历结果集。但一般情况下,应尽量避免使用游标。原因:1. 游标违背了关系模型,即按集合来考虑问题的思想;2. 游标逐行对纪录进行操作,会带来额外的开销,使用游标的解决方案通常比使用集合的解决方案要慢得多;3. 使用游标的解决方案,需要用很多代码来描述对游标的操作,因此代码更长,可读性更差,也更难以维护。

    只有在少数情况下才应当使用游标。举两个例子:1. 需要遍历表名,进行DDL操作;2. 连续聚合,此时基于游标的解决方案可能比基于集合的解决方案更快。

    热心网友 时间:2022-04-30 03:18

    游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。

    一般是在需要对查询的结果集中的数据再进行二次处理才会用到。

    热心网友 时间:2022-04-30 05:26

    游标是在数据集中表示当前的位置的,一般是用在数据集的遍历用到,比如很多 resultset中
    sql语句编写存储过程,使用游标循环打印学生表中的数据,求大神_百度...

    游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 查询语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。我们知...

    sqlserver 有几种循环

    游标循环:针对你select出来的值进行循环 除了上述那些还有复活形的多游标,嵌套循环等。

    sql 中的数据类型有那些?请讲明白些

    游标的引用。 sql_variant 一种存储 SQL Server 支持的各种数据类型(text、ntext、timestamp 和 sql_variant 除外)值的数据类型。 table 一种特殊的数据类型,存储供以后处理的结果集。 timestamp 数据库范围的唯一数字,每次更新行时也进行更新。 uniqueidentifier 全局唯一标识符 (GUID)。 回答者:wfchenjin - 大魔...

    sqlserver sql代码循环问题

    游标是sql中效率最低的,尽量不要使用游标,如果你的参数名可以自己定义的话就好办了,比如,@test1,@test2...@test10,定义成有规律的,那么可以通过拼参数名的方式 set @sql='update dbo.KY_ProjectResult set state=1 where Project_Result_ID='+‘@test’+cast((11-@count) as char(10)...

    sqlserver中怎样使用游标for循环

    利用游标循环更新、删除MemberAccount表中的数据 DECLARE My_Cursor CURSOR --定义游标FOR (SELECT * FROM dbo.MemberAccount) --查出需要的集合放到游标中OPEN My_Cursor; --打开游标FETCH NEXT FROM My_Cursor ; --读取第一行数据WHILE @@FETCH_STATUS = 0 BEGIN --UPDATE dbo.MemberAccount ...

    100分 求教SQLSERVER中的用游标遍历表中的列并实现累加输出。_百度知 ...

    而@@FETCH_STATUS返回3种状态,0 FETCH 语句成功。-1 FETCH 语句失败或此行不在结果集中。-2 被提取的行不存在。这样在游标移动到最后一行的时候,进行while判断@@FETCH_STATUS为0 ,进行一次加值,然后又直接进入while判断 这时候你还没有移动游标,@@FETCH_STATUS还是为0,又进行了一次加值,然后...

    在sqlserver2000中,用什么语句能求出表中一行的最大值?

    第二个游标用来寻找每条记录的最大值 找到以后,依次存储,这样就得到表的一行的最大值了 答案补充:上面的答案有一个问题 ,第二个游标没法实现,目前我给出一个在知道列数和列名的情况下的例子。更加通用的需要再考虑 例:假设A表里面有x,y,z3列,并且这3列都是int型列 create table ##temp(...

    SQL语句分页查询,一页面多少数据合适

    微软的SQLSERVER提供了两种索引:聚集索引,也称聚类索引、簇集索引和非聚集索引,也称非聚类索引、非簇集索引。建立一个web应用,分页浏览功能必不可少。这个问题是数据库处理中十分常见的问题。经典的数据分页方法是:ADO纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页。但这种分页方法...

    教你怎么使用sql游标实例分享

    @reward end --3.关闭游标 close cur_reward --4.释放资源 deallocate cur_reward 说明:在一般情况下,不要使用游标。性能极点低下。 假如在处理大量数据。普通的sql 执行非常慢时,这个时候可以试试游标。也许会给你带来意想不到效果 作者 xhccom 您可能感兴趣的文章:sqlserver 游标的简单示例...

    游标最最基础教程和解释

    INSENSITIVE 定义一个游标,以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的这一临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。使用 SQL-92 语法时,如果省略 INSENSITIVE,则已提交的(任何用户)对基础表的删除和更新都反映在...

    游标是什么意思 什么是游标cursor sqlserver游标的使用场景 游标是什么 数据库游标是什么 sqlserver简单游标使用 什么情况需要用游标 数据库用什么声明游标 oracle游标的使用
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    电话线如何连接多个电话机? 和另一半睡觉时最哭笑不得的事情是什么? 你们见过最奇葩的情侣有哪些? 12星座男对自己女票做过哪些奇葩事? 微信上我删除一个人,对方那边显示吗?可以知道我删除他吗?是不是... word拼音加声调的三种方法哪个更简单易用? 每月对监控系统应该好哪些选择记录 佛山市南海桂城海八路华南汽车城 浙江苍南县是哪个市 一勾新月伴三星(打一字)谜底及原因 硬盘已经很老了,重装了电脑,不知道如何合理分配那abcd盘 黄宗泽的抒情歌 装电脑XP系统,分ABCD盘时磁盘的空间怎么分配? 上海传奇里面黄宗泽唱的那首歌叫什么啊 怎么样分配电脑ABCD盘 黄宗泽歌 QQ音乐最高等级不是8么怎么有的是12级? 黄宗泽的最后祝福粤语歌词 tvb水之源DE 歌曲 黄宗泽唱的 求歌名 oh baby i love you i love you everyday . 需要这首歌的名字和歌词。 请求回答 梁平新区的地理位置 内涵段子有一个视频不知道是什么歌 歌词是: 路途也快走到尽头 就在下 梁平县的区划 最后祝福 歌词 重庆梁平有哪些镇 黄宗泽所有歌曲 有一首粤语歌,歌词我只记得好好的相处男唱的 求解答 重庆市梁平县有人口多少 我要你爱我 再一次深深爱我 歌名是什么 谢谢 黄宗泽所有歌的歌词 有什么好听的粤语男歌? 如何给系统盘再分盘? 求奔跑吧第五季热巴和邓超尬舞时候,和黄宗泽跳舞的背景音乐 电脑中的ABCD盘都起什么作用? 我想问一下 奔跑吧第五季 最后黄宗泽跳舞的歌名是什么 固态硬盘有ABCD盘? 抖音里黄宗泽和小猪视频的音乐叫什么? 电脑重装后硬盘分区混乱,是把原来C盘又分成了ABCD四个盘 为什么我的电脑里的磁盘不显示ABCD盘了? 宏基的电脑没有I H 等盘怎么办(有ABCD盘) 电脑卡我把abcd盘我把电脑上的东西全部删了,现在懵了,怎么解 台式电脑 硬盘 怎么把u盘分成多个盘,像打开我的电脑一样有ABCD盘 电脑高手们帮帮我 我的电脑进入我的电脑慢搜索半天才把那些ABCD盘搜出来。。 电厂都用布袋除尘器吗?谢谢。 在我的电脑里ABCDEFGH盘各用来装什么? 怎么看电脑硬盘 内存的大小? 怎么把硬盘的空间加到另一个硬盘上 布袋除尘器与袋式除尘器有什么区别? windows7系统电脑abcd盘背景图片怎么设置?