设为首页 收藏本站
查看: 761|回复: 0

[经验分享] SQL Server的游标之我见

[复制链接]

尚未签到

发表于 2018-10-15 07:58:45 | 显示全部楼层 |阅读模式
  SQL Server的游标之我见
  T-SQL语句对表的操作通常是一个结果集。游标是SQL Server提供的一种机制,它能够对一个结果集进行逐行处理。
  游标的优点:
  1.允许程序对由查询语句select返回的行集合中的每一行执行相同或不同的操作,而不是对整个行集合执行同一个操作;
  2.提供基于游标位置的表中的行进行删除和更新的能力;
  3.游标实际上作为面向集合的数据库管理系统和面向行的程序设计之间的桥梁,使这两种处理方法通过游标沟通起来。
  游标的使用顺序:声明游标,打开游标,读取游标,关闭游标,删除游标。
  DECLARE  [INSENSITIVE][SCROLL] CURSORFOR 这里我说一下游标中级应用中的[INSENSITIVE]和[SCROLL]
  INSENSITIVE
  表明MS SQL SERVER 会将游标定义所选取出来的数据记录存放在一临时表内(建立在tempdb 数据库下)。对该游标的读取操作皆由临时表来应答。因此,对基本表的修改并不影响游标提取的数据,即游标不会随着基本表内容的改变而改变,同时也无法通过游标来更新基本表。如果不使用该保留字,那么对基本表的更新、删除都会反映到游标中。
  另外应该指出,当遇到以下情况发生时,游标将自动设定INSENSITIVE 选项。
  a.在SELECT 语句中使用DISTINCT、 GROUP BY、 HAVING UNION 语句;
  b.使用OUTER JOIN;
  c.所选取的任意表没有索引;
  d.将实数值当作选取的列。
  SCROLL

  表明所有的提取操作(如FIRST、 LAST、 PRIOR、 NEXT、>  在从游标中取值的过程中,可以在结果集中的每一行上来回移动和处理。如果游标定义成了可滚动的(在声明时使用SCROLL关键字),则任何时候都可取出结果集中的任意行。对于非滚动的游标,只能对当前行的下一行实施取操作。结果集可以取到局部变量中。Fetch命令的语法如下:

  FETCH [NEXT | PRIOR| FIRST | LAST |ABSOLUTE {n | @nvar} |>  FROM [GLOBAL] cursor_name} | cursor_variable_name}
  [INTO @variable_name ][,……n]]
  NEXT指明从当前行的下一行取值。
  PRIOR指明从当前行的前一行取值,与next相反,取得是上一行的值。
  FIRST是结果集的第一行。
  LAST是结果集的最后一行。
  ABSOLUTE n表示结果集中的第n行,该行数同样可以通过一个局部变量传播。行号从0开始,所以n为0时不能得到任何行。
  RELATIVE n表示要取出的行在当前行的前n行或后n行的位置上。如果该值为正数,则要取出的行在当前行前n行的位置上,如果该值为负数,则返回当前行的后n行。
  INTO @cursor_variable_name表示游标列值存储的地方的变量列表。该列表中的变量数应该与DECLARE语句中选择语句所使用的变量数相同。变量的数据类型也应该与被选择列的数据类型相同。直到下一次使用FETCH语句之前,变量中的值都会一直保持。
  每一次FETCH的执行都存储在系统变量@@fetch_status中。如果FETCH成功,则@@fetch_status被设置成0。@@fetch_status为-1表示已经到达了结果集的一部分(例如,在游标被打开之后,基表中的行被删除)。@@fetch_status可以用来构造游标处理的循环。
  @@fetch_status是MSSQL的一个全局变量
  其值有以下三种,分别表示三种不同含义:【返回类型integer】
  0 FETCH 语句成功
  -1 FETCH 语句失败或此行不在结果集中
  -2 被提取的行不存在
  @@fetch_status值的改变是通过fetch next from实现的,如“FETCH NEXT FROM Cursor”
  用@@fetch_status来控制while循环中的游标活动。
如:DECLARE Employee_Cursor CURSOR FOR  SELECT BusinessEntityID, JobTitle
  FROM AdventureWorks2012.HumanResources.Employee;
  OPEN Employee_Cursor;
  FETCH NEXT FROM Employee_Cursor;
  WHILE @@FETCH_STATUS = 0
  BEGIN
  FETCH NEXT FROM Employee_Cursor;
  END;
  CLOSE Employee_Cursor;
  DEALLOCATE Employee_Cursor;
  GO



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-621687-1-1.html 上篇帖子: SQL Server与Oracle简单比较 下篇帖子: SQL SERVER数据库导入
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表