加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SqlServer-Cursor讲解一

发布时间:2020-12-12 13:07:47 所属栏目:MsSql教程 来源:网络整理
导读:原创文章,转载必需注明出 处: http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/introduce-for-sqlserver-s-cursor-1/ 最近一段时间做项目写的T-Sql代码老是用到游标(Cursor),所以就研究研究它的用法。这真是不看不知道,一看吓一跳。闲话少

原创文章,转载必需注明出处:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/introduce-for-sqlserver-s-cursor-1/

最近一段时间做项目写的T-Sql代码老是用到游标(Cursor),所以就研究研究它的用法。这真是不看不知道,一看吓一跳。闲话少说,下面我们来说说Cursor的用法。

这是MSDN中Cursor的定义语句:

DECLARE?cursor_name?[?INSENSITIVE?]?[?SCROLL?]?CURSOR?
?????FOR?select_statement?
?????[?FOR?{?READ?ONLY?|?UPDATE?[?OF?column_name?[?,...n?]?]?}?]
[;]
Transact-SQL?Extended?Syntax
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并且使用它的语句吧:

create?table?#table(?Id?int,?Name?nvarchar(512))
insert?into?#table?values(?1,?N'dong')
insert?into?#table?values(?2,?N'liu')
?
declare?@name?nvarchar(512)
declare?MyCursor?cursor?for?select?Name?from?#table?--定义游标,游标数据集来源临时表#table
open?MyCursor?--打开游标以供下面代码使用
fetch?next?from?MyCursor?into?@name?--将游标指向的值赋值给临时变量@name,游标指向下一条数据
while?@@FETCH_STATUS=0?--判断游标是否到最后一条记录
begin
	select?@name
	fetch?next?from?MyCursor?into?@name
end
close?MyCursor?--关闭游标
deallocate?MyCursor?--?释放最后的游标引用时
drop?table?#table

通过上面的代码可以很快的学到如何定义以及使用一个游标,另外需要注意的是使用完的游标一定要关闭(close)并且释放(deallocate)。

上面是对游标使用的简单了解,但是本文的真正目的不是这个。下面要说的才是重点。

SqlServer中我们对查询等语句的定位是面向集合的,即操作某一集合内的数据。但是Cursor却并非如此,它的操作对象是面对某一条(行)数据的。这样就在性能上就会显得Cursor更加的占内存、占代码空间、锁定资源……?当然这些弊端要在Cursor操作足够条数据多的时候才会显现出来。

所以总体来说还是少用Cursor的好。但是当我们穷尽了while循环,子查询,临时表,表变量,自建函数或其他方式仍然无法实现某些查询的时候,使用游标实现是必不可少的方法。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读