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

[经验分享] MS SQL Server 游标及实例(一)

[复制链接]

尚未签到

发表于 2018-10-15 12:33:52 | 显示全部楼层 |阅读模式
  一 游标简介
  (游标)cursor 是系统为用户开设的一个数据缓冲区,存放sql语句的执行结果,每个游标区有一个个名字,用户可以用sql语句逐一从游标中获取记录,并赋给主变量,交由主语言进行处理
  提供了一种从表中检索出的数据进行操作的灵活手段。本质:是一种能从包含多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条sql选择语句相关联因为游标由结果集(可以是零条,一条,或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成,当决定对结果集进行处理时,必须声明一个指向该结果集的游标。
  如果曾经用 C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就可代表该文件。对于游标而言,其道理是相同的。可见游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。
  

    二 游标分类
  MS SQL Server 支持三种类型的游标:Transact_SQL 游标,API服务器游标和客户游标
  
  (1) Transact_SQL 游标
  Transact_SQL 游标是由DECLARE CURSOR 语法定义、主要用在Transact_SQL 脚本、存储过程和触发器中。Transact_SQL 游标主要用在服务器上,由从客户端发送给服务器的Transact_SQL 语句或是批处理、存储过程、触发器中的Transact_SQL 进行管理。 Transact_SQL 游标不支持提取数据块或多行数据。
  (2) API游标
  API 游标支持在OLE DB, ODBC 以及DB_library 中使用游标函数,主要用在服务器上。每一次客户端应用程序调用API 游标函数,MS SQL SEVER 的OLE DB 提供者、ODBC驱动器或DB_library 的动态链接库(DLL) 都会将这些客户请求传送给服务器以对API游标进行处理。
  (3) 客户游标
  
  客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。由于服务器游标并不支持所有的Transact-SQL 语句或批处理,所以客户游标常常仅被用作服务器游标的辅助。因为在一般情况下,服务器游标能支持绝大多数的游标操作。由于API 游标和Transact-SQL 游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。在本章中我们主要讲述服务器(后台)游标
  
  三游标实例 1
  游标定义例子1 :
  create proc cursorTest
  @_id int=0,
  @_name varchar(50)=''
  as
  --创建游标
  declare @cursor cursor
  --设定游标欲操作的数据集
  set @cursor=cursor for
  select _id,_name from users
  --打开游标
  open @cursor
  --移动游标指向到第一条数据,提取第一条数据存放在变量中
  fetch next from @cursor into @_id,@_name
  --如果上一次操作成功则继续循环
  while(@@fetch_status=0)
begin

  --操作提出的数据
  print @_name
  --继续提下一行
  fetch next from @cursor into @_id,@_name
  end
  --关闭游标
  close @cursor
  --删除游标
  deallocate @cursor

    游标例子2.
  
CREATE proc [dbo].[As_Proc_GetPlanDetail]

  (

  @ids varchar(max)--

  )

  as

  create table #temp

  (

  dept varchar(100),

  sorttitle varchar(200),

  title varchar(200),

  spec varchar(50),

  model varchar(50),

  budget decimal(18,2),

  amount int,

  sgamount int,

  htamount int,

  ysamount int,

  fenfamount int

  )

  declare @did varchar(32)

  declare @sorttitle varchar(200)

  declare @title varchar(200)

  declare @spec varchar(50)

  declare @model varchar(50)

  declare @budget decimal(18,2)

  declare @amount int

  declare @sgamount int

  declare @htamount int

  declare @ysamount int--验收数量

  declare @fenfamount int--分发数量

  declare cursor1 cursor for

  select rowid,dbo.clip(ypdept,':',1) from As_year_plan where Charindex(rowid,@ids,0)>0 union select rowid,dbo.clip(department,':',1) from As_assets_requisition where Charindex(rowid,@ids,0)>0 -----------------------------------------------控制计划

  declare @rowid varchar(32)

  declare @dept varchar(100)

  open cursor1

  fetch next from cursor1 into @rowid,@dept

  while @@fetch_status=0

  begin

  declare cursor2 cursor for select a.rowid, b.sorttitle,a.title,a.spec,a.model,a.budget,a.amount from As_assts_planDetai a left join As_assetsSort b on a.sortId=b.rowid where planID=@rowid

  open cursor2

  fetch next from cursor2 into @did, @sorttitle, @title,@spec, @model ,@budget ,@amount

  while @@fetch_status=0

  begin

  select @sgamount= isnull(sum(a.amount),0) from As_assets_buyDetail a inner join As_assets_buy b on a.buyId=b.rowid where a.planId=@did and b.state=1

  --print @did

  select @htamount= isnull(sum(a.amount),0) from As_contract_detail a inner join As_stock_contract b on a.contId=b.rowid where b.state=1 and a.bydetId in(

  select c.rowid from As_assets_buyDetail c inner join As_assets_buy d on c.buyId=d.rowid where c.planId=@did and d.state=1)

  ---验收数量

  select @ysamount=count(1) from As_AssetsInfo a inner join As_contract_detail b on a. contractId=b.rowid where b.bydetId in(select rowid from As_assets_buyDetail where planId=@did)

  --分发数量

  select @fenfamount=count(1) from As_AssetsInfo a inner join As_contract_detail b on a. contractId=b.rowid where b.bydetId in(select rowid from As_assets_buyDetail where planId=@did) and a.drawState=1

  insert into #temp(dept, sorttitle,>

  fetch next from cursor2 into @did, @sorttitle, @title,@spec, @model ,@budget ,@amount

  end

  close cursor2 --关闭游标

  deallocate cursor2

  fetch next from cursor1 into @rowid,@dept

  end

  close cursor1 --关闭游标

  deallocate cursor1 --释放游标

  --查询临时表

  select * from #temp


运维网声明 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-621928-1-1.html 上篇帖子: SQL Server 2008 插入修改图片信息 下篇帖子: SQL Server 2008 远程过程调用失败
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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