`

详解什么是SQL Server中的游标及相关实例

阅读更多

引言
我们先不讲游标的什么概念,步骤及语法,先来看一个例子:
     
表一 OriginSalary                                                    表二 AddSalary
现在有2张表,一张是OriginSalary表--工资表,有三个字段0_ID 员工号(NVARCHAR)、O_Name员工姓名(NVARCHAR)、O_Salary工资(FLOAT)。
另一张表AddSalary表—加薪表。有2个字段,O_ID员工号、A_Salary增加工资。两张表的O_ID是一一对应的,现在求将加薪的工资+原来的工资=现在的工资,也就是O_Salary=O_Salary+A_Salary,修改表OriginSalary的工资字段。
对于一些不熟悉游标的程序员来说,这个并不是什么很难的问题,这个问题用程序来实现可能也很简单。我先说说,用ASP.NET程序解决这个问题的思路:
1.       先获得表OriginSalary的记录数,写个循环。
2.       写SQL语句“select * from dbo.OriginSalary as A left join dbo.AddSalary as B on A.O_ID=B.O_ID”获得视图。
3.       使用Dataset获得O_Salary=O_Salary+A_Salary。
4.       写UPDATE语句“update OriginSalary set O_Salary=”相加的值” where O_ID=”获得值”
5.       循环3次,完成此功能。
还有一种方法就是写存储过程,在这里我就不列出来了。
我想大家在学习游标之前好好想想这个问题,及一些批量处理的例子。可能有的人会说:“难道数据库不能一行一行的处理数据吗?将表AddSalary的数据逐行的取出,然后表 OriginSalary数据逐行的修改?”答案当然是肯定。这就是游标概念。接下来的一章我们会好好的讲讲什么是游标?我会用游标来解决刚才留给大家的问题。
1.1游标的概念
游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集。使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。
1.2 游标的优点
从游标定义可以得到游标的如下优点,这些优点使游标在实际应用中发挥了重要作用:
1)允许程序对由查询语句select返回的行集合中的每一行执行相同或不同的操作,而不是对整个行集合执行同一个操作。
2)提供对基于游标位置的表中的行进行删除和更新的能力。
3)游标实际上作为面向集合的数据库管理系统(RDBMS)和面向行的程序设计之间的桥梁,使这两种处理方式通过游标沟通起来。
1.3 游标的使用
讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱。
使用游标的顺序: 声名游标、打开游标、读取数据、关闭游标、删除游标。
1.3.1声明游标
最简单游标声明:DECLARE <游标名>CURSOR FOR<SELECT语句>;
其中select语句可以是简单查询,也可以是复杂的接连查询和嵌套查询
例子:[已表2 AddSalary为例子]

Declare mycursor cursor for select * from AddSalary
复制代码
这样我就对表AddSalary申明了一个游标mycursor
【高级备注】

DECLARE <游标名> [INSENSITIVE] [SCROLL] CURSORFOR<SELECT语句>
复制代码
这里我说一下游标中级应用中的[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、 RELATIVE、 ABSOLUTE)都可用。如果不使用该保留字,那么只能进行NEXT 提取操作。由此可见,SCROLL 极大地增加了提取数据的灵活性,可以随意读取结果集中的任一行数据记录,而不必关闭再
重开游标。
1.3.2 打开游标
非常简单,我们就打开刚才我们声明的游标mycursor
OPEN mycursor
1.3.3读取数据
FETCH [ NEXT | PRIOR | FIRST | LAST] FROM { 游标名  | @游标变量名 } [ INTO @变量名 [,…] ]
参数说明:
NEXT   取下一行的数据,并把下一行作为当前行(递增)。由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCH NEXT操作将取得游标集中的第1行数据。NEXT为默认的游标提取选项。
INTO @变量名[,…]  把提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。
现在我们就取出mycursor游标的数据吧!
当游标被打开时,行指针将指向该游标集第1行之前,如果要读取游标集中的第1行数据,必须移动行指针使其指向第1行。就本例而言,可以使用下列操作读取第1行数据:
Eg: Fetch next from mycursor 或则 Fetch first from mycursor
这样我就取出了游标里的数据,但是光光这样可不够,我们还需要将取出的数据赋给变量

//声明2个变量  declare @O_ID NVARCHAR(20)  declare @A_Salary float //将取出的值传入刚才声明的2个变量  Fetch next from mycursor into @ O_ID,@ A_Salary
复制代码
1.3.4关闭游标
CLOSE mycursor  
1.3.5删除游标
DEALLOCATE mycursor        
1.3.6 实例训练
如上我介绍完了游标使用的5个步骤,那现在我们就来上上手,练习用游标取出表2 AddSalary的数据。
为了运行我们自己创建的游标,我们将游标写在存储过程里,方便我们看到游标的整个使用过程。
在sqlserver2000中新建一个存储过程:

CREATE PROCEDURE PK_Test  AS //声明2个变量  declare @O_ID nvarchar(20)     declare @A_Salary float    //声明一个游标mycursor,select语句中参数的个数必须要和从游标取出的变量名相同  declare mycursor cursor for select O_ID,A_Salary from AddSalary     //打开游标  open mycursor     //从游标里取出数据赋值到我们刚才声明的2个变量中  fetch next from mycursor into @O_ID,@A_Salary     //判断游标的状态  //0 fetch语句成功       //-1 fetch语句失败或此行不在结果集中       //-2被提取的行不存在  while (@@fetch_status=0)   begin      //显示出我们每次用游标取出的值      print '游标成功取出一条数据'      print @O_ID     print @A_Salary     //用游标去取下一条记录     fetch next from mycursor into @O_ID,@A_Salary  end   //关闭游标  close mycursor   //撤销游标  deallocate mycursor  GO
复制代码
通过上面的注释,我想大家都明白了整个游标的创建过程了吧。但是我们现在还是一个抽象的了解,我们学任何知识,都要用于实践,这样才能使抽象的东西变的具体。
那我们就运行这个存储过程,看看游标到底是怎么取值的:
我们打开SQLSERVER2000的查询分析器,制定好数据库后,我们执行存储过程
Exec PK_Test
让我看看效果吧(如图)

通过实例我们可以看到游标逐行逐行都把值都取出来了。那么我请大家先不看下面的答案,在引言部分我刚才留个大家的问题试一下能不能解决?
现在我们写一个存储过程解决刚才我留下来的问题吧

CREATE PROCEDURE PK_SalaryAdd  AS declare @O_ID nvarchar(20),@A_Salary float declare mycursor cursor for select O_ID,A_Salary from AddSalary  open mycursor  fetch next from mycursor into @O_ID,@A_Salary  while(@@fetch_status = 0)  begin Update OriginSalary set O_Salary=O_Salary+@A_Salary where O_ID=@O_ID  fetch next from mycursor into @O_ID,@A_Salary  end close mycursor  deallocate mycursor  GO
复制代码
按照老方法,我们用查询分析器来执行我们的存储过程,看看结果是怎么样的?
Exec PK_SalaryAdd
让我看看效果吧(如图)


执行存储过程,看到我们影响了3行数据

用sql语句,看看表OriginSalary现在的结果:                                                     

1.4 结束语
很高兴大家能把这个教程看完,其实这只是游标的最最基础的一个应用,显示生活的逻辑的关系中,可能有更复杂的游标。但是我们只有学会走路,才能跑步嘛
 

分享到:
评论

相关推荐

    sql server 游标实例

    ### SQL Server 游标实例详解 #### 一、游标概念与作用 在SQL Server中,游标是一种数据库对象,允许我们逐行处理查询结果集中的数据。这与普通的SQL查询不同,在普通的查询中,结果集通常是作为一个整体来处理的。...

    SqlServer存储过程游标

    ### SqlServer 存储过程与游标应用实例详解 #### 一、存储过程概述 在SQL Server中,存储过程是一种预编译的SQL语句集合,它可以被当作一个单独的对象来调用。存储过程可以提高应用程序性能,简化复杂的业务逻辑,...

    oracle游标使用及实例

    ### Oracle游标使用及实例详解 #### 一、Oracle游标概述 在Oracle数据库中,游标(Cursor)是一种用于处理SQL查询结果集的方式。它允许用户逐行地读取和处理查询结果,这对于需要对每一行数据进行特定操作的情况非常...

    SQL游标实例

    SQL游标是数据库管理系统中一个重要的概念,它允许程序员或数据库管理员逐行处理查询结果集,而不仅仅是一次性处理整个结果集。在处理大量数据或需要按特定顺序执行操作时,游标显得尤为有用。本篇文章将深入探讨SQL...

    SQL游标使用例子--有注释

    ### SQL游标使用详解 #### 一、引言 在SQL编程中,游标是一种用于处理查询结果集的工具,可以实现对数据行的逐行访问。本文将通过一个具体的示例来详细介绍如何使用SQL游标,并解释其背后的原理与应用场景。 ####...

    数据库实例详解——图书管理系统(包括SQL代码,游标,存储过程)

    数据库实例详解——图书管理系统 在IT领域,数据库是管理和存储数据的核心工具,尤其在图书管理系统中,数据库的设计和实现显得尤为重要。本实例将深入探讨如何构建一个完整的图书管理系统,涉及的关键知识点包括...

    最新SQL Server看图教程详解

    3. **数据库管理**:在SQL Server中,数据库是数据的主要容器。教程可能会教你如何创建、删除和备份数据库,以及如何使用Transact-SQL(T-SQL)进行数据操作。 4. **表的创建与管理**:在数据库中,表是数据存储的...

    jdbc分页实例sqlserver2000

    标题中的“jdbc分页实例sqlserver2000”指的是使用Java Database Connectivity (JDBC) API来实现数据库分页查询的示例,特别是在SQL Server 2000这个特定的数据库管理系统上。JDBC是Java中用于与各种类型数据库交互...

    Orcle游标实例.txt

    ### Oracle 游标实例解析及应用 #### 一、Oracle游标概述 在Oracle数据库中,游标(Cursor)是一种数据库对象,它允许程序能够逐行处理查询结果集中的数据。与直接执行SQL语句获取整个结果集不同,游标可以逐行...

    sql语句大全和SQL server精华

    SQL Server的经典手册通常包含以下几个部分:系统架构介绍、T-SQL(Transact-SQL,SQL Server的扩展语法)详解、索引和优化、存储过程、触发器、游标、函数、安全性管理、备份与恢复策略、故障排查和性能调优等。...

    数据库SQLServer培训课件

    "二、PL/SQL基础篇"主要针对SQL Server中的过程化编程语言。虽然SQL Server的默认编程语言是T-SQL,但其概念与PL/SQL相似。这部分内容将涵盖变量声明、流程控制语句(如IF-THEN-ELSE、WHILE循环)、游标、存储过程和...

    当时自己初学SQL时,对游标很难理解,现在编写了一个实例游标循环,到时写SQL循环时方便些

    本文将通过一个具体的SQL游标的使用示例来深入探讨其工作原理及应用技巧。 #### 二、游标概念概述 游标(Cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以通过...

    Microsoft_SQL_Server_2005技术内幕:T-SQL查询.pdf

    本书及其续篇——《Microsoft SQL Server 2005技术内幕:T-SQL程序设计》介绍了SQL Server 2005中高级T-SQL查询、查询优化及编程相关的知识。这两本书侧重于解决实践中的常见问题,并讨论了解决这些问题的方法。它们...

    OLEDB驱动程序大全 SQLServer-OleDB-Provider

    2. SQL Server OLE DB Provider详解: SQL Server OLE DB Provider是Microsoft SQL Server的专用数据提供者,它允许开发者直接与SQL Server进行通信,执行SQL查询,管理事务,处理结果集等。这个提供者支持多种...

    MongoDB 游标详解及实例代码

    MongoDB 游标详解 MongoDB中的游标与关系型数据库中的游标在功能上大同小异。游标相当于C语言的指针,可以定位到某条记录,在MongoDB中,则是文档。... mongoDB的游标与关系型数据库SQL中的游标类似,可以

    都市信息网(Struts2+sql server 2000)

    Struts2是Java企业级应用中广泛使用的MVC(Model-View-Controller)框架,而SQL Server 2000则是微软推出的关系型数据库管理系统,两者结合为网站提供了稳定、高效的数据存储和处理能力。 1. **Struts2框架详解**:...

    sql server术语学习表

    **定义**:`SQL Collation`是指SQL Server中用于定义字符数据比较方式的一组规则。 **用途**:确定如何比较和排序文本数据。 #### SQL Database (SQL数据库) **定义**:`SQL Database`是指SQL Server中的数据存储...

    SQLServer常用字段类型

    ### SQL Server 常用字段类型详解 在数据库设计与管理中,选择合适的字段类型对于数据的存储效率、查询性能以及数据完整性至关重要。SQL Server 提供了丰富的数据类型,覆盖了从基本数值到复杂文本、图像等各类数据...

    sqljdbc4-4.0.jar

    3. **XML支持**:可以直接在SQL Server中处理XML类型的数据。 4. **事务管理**:支持ACID(原子性、一致性、隔离性和持久性)特性,确保数据操作的可靠性。 5. **SQL Server特有的功能**:例如,使用`sp_send_dbmail...

Global site tag (gtag.js) - Google Analytics