陈奇网络工作室

sqlserver游标概念和实例的完整说明

建设工作站服务器

引言

有关游标的概念、步骤和语法,请首先查看一个示例。

表OriginSalary表添加销售

现在有两个表。 一个是OriginSalary表。 工资表包含三个字段:0_ID员工编号( NVARCHAR )、O_Name员工姓名( NVARCHAR )和O_Salary工资( FLOAT )。

另一个表AddSalary表-加薪表。 有两个字段。 O_ID员工号码,A_Salary提高工资。 两张表的O_ID是一一对应的,求出当前加薪工资的原工资=当前工资,即O_Salary=O_Salary A_Salary,修改表中OriginSalary的工资字段。

对于不熟悉游标的程序员来说,这不是一个难题,用程序实现也可能很容易。 首先,让我谈谈通过ASP.NET程序解决这个问题的思路:

1 .首先获得表OriginSalary的记录数,写出周期。

2 .编写SQL语句“select * fromdbo.originsalaryasaleftjoindbo.addsalaryasbona.o _ id=b.o _ id”以获取视图。

使用Dataset获取O_Salary=O_Salary A_Salary。

写入与UPDATE语句“update OriginSalary set O_Salary=”相加的值“where O_ID=”获得值”

5 .循环三次,完成这个功能。

另一种方法是写存储过程,但这里不列出。

大家在学习光标之前,想仔细考虑这个问题和几个批量处理的例子。 有人问:“数据库不能逐行处理数据吗? 是否一次检索一行表AddSalary中的数据,一行更改表OriginSalary中的数据? ’当然,答案是肯定的。 这就是光标的概念。 在下一章里,你经常谈论什么是光标吗? 用光标解决刚才留给大家的问题。

1.1游标概念

游标( Cursor )允许用户逐行访问从SQL Server返回的结果集。 使用游标( cursor )的主要原因之一是将集合操作转换为单个记录处理方法。 用SQL语言从数据库中检索数据时,结果会放在内存空间中,通常是包含多条记录的集合。 游标机制允许用户在SQL server中逐行访问这些记录,并根据自己的意愿查看和处理这些记录。

1.2光标的优点

从游标定义中获得的游标优点如下: 这些优点在实际的APP中光标起着重要的作用。

1 )程序可以对查询语句select返回的行集中的每一行执行相同或不同的操作,而不是对整个行集执行相同的操作。

2 )提供根据光标位置删除和更新表中行的功能。

3 )游标实际上是连接集合指向数据库管理系统( RDBMS )和低指向编程的桥梁,这两种处理方法通过游标进行交流。

1.3使用游标

阐述了这个多光标的优点,现在我们亲自来揭开光标的神秘面纱。

使用光标的顺序为“声誉光标”、“打开光标”、“读取数据”、“关闭光标”和“删除光标”。

1.3.1游标声明

最简单的游标声明: DECLARE游标名称CURSOR FORSELECT语句;

其中,select语句可以是简单查询,也可以是复杂的连续查询或嵌套查询

例如: [以表2的2 AddSalary为例]

declaremycursorcursorforselect * fromaddsalary

就这样,我向表AddSalary声明了光标mycursor

【上级备注】

DECLARE游标名称[不敏感] [ scroll ] cursorforselect语句

本节介绍游标中级APP应用程序的[不敏感]和[滚动]

不敏感

表示MS SQL SERVER将游标定义中选定的数据记录存储在tempdb数据库下创建的临时表中。 对此游标的所有读取操作都将通过临时表进行响应。 因此,更改基表不会影响游标中提取的数据。 这意味着,如果基表的内容更改,游标不会更改,也无法使用游标更新基表。 如果不使用此保留字,则游标将反映对基本表的更新和删除。

此外,请注意,游标在以下情况下会自动设置不敏感选项:

在SELECT语句中使用DISTINCT、GROUP BY和HAVING UNION语句;

使用输出接头;

c .选定的任何表都没有索引

d .将实数值设置为选定行。

SCROLL

表示所有提取操作(如FIRST、LAST、PRIOR、NEXT、RELATIVE和ABSOLUTE )均可用。 不使用保留字时,只能进行NEXT提取操作。 这表明,SCROLL大大提高了数据提取的灵活性,可以自由读取结果集中任意行的数据记录,而无需关闭

重新开始光标。

1.3.2打开光标

很简单。 打开刚才声明的光标mycursor

OPEN mycursor

1.3.3数据读取

etch [ next|prior|from {光标名称| @光标变量名} [ INTO @变量名[,…] ]

参数说明:

NEXT下一行的数据,将下一行作为当前行。 当您打开游标时,第一次执行FETCH NEXT操作将检索游标集中的第一行数据,因为行指针指向游标的第一行之前。 NEXT是默认的光标提取选项。

INTO @变量名[,…]将提取操作的列数据放入局部变量。 列表中的每个变量都与游标结果集中的相应列从左到右相关联。 每个变量的数据类型必须与相应结果列的数据类型匹配,或者是结果列的数据类型所支持的隐式转换。 变量的数量必须与游标选择列表中的列数相匹配。

现在就取出mycursor光标的数据吧。

当游标打开时,行指针指向游标集中的第一行。 要读取游标集中的第一行数据,必须将行指针移动到指向第一行。 在本例中,可以通过以下操作读取第一行中的数据:

Eg: Fetch next from mycursor或Fetch first from mycursor

这样就取出了光标中的数据,但光是不够的。 需要将检索到的数据分配给变量

//声明两个变量

declare@o_idNvarchar(20 ) )。

declare @A_Salary float

//将检索到的值传递给刚才声明的两个变量

Fetch next from mycursor into @ O_ID,@ A_Salary

1.3.4关闭光标

CLOSE mycursor

1.3.5删除光标

戴尔我的cursor

1.3.6实例培训

以上介绍了使用光标的5个步骤。 那么,现在让我们举手,练习用光标取出表2的2 AddSalary的数据。

为了执行您自己创建的游标,您将游标写入了存储过程,以便可以轻松地查看游标的整个使用过程。

在sqlserver2000上创建新的存储过程:

CREATE PROCEDURE PK_Test

AS

//声明两个变量

declare@o_idNvarchar(20 ) )。

declare @A_Salary float

//声明游标mycursor。 select语句的参数数量必须与从游标中检索到的变量名相同

declaremycursorcursorforselecto _ id,A_Salary from AddSalary

//打开光标

open mycursor

//从光标中取出数据,代入刚才声明的两个变量

fetch next from mycursor into @O_ID,@A_Salary

//判断光标的状态

//0 fetch语句成功

//-1 fetch语句失败,或者此行不在结果集中

//-2提取的行不存在

while (@@fetch_status=0)

比根

//显示我们每次用光标取出的值

打印\\& amp; quot; 游标已成功检索到数据: quot;

print @O_ID

print @A_Salary

//用光标删除下一条记录

fetch next from mycursor into @O_ID,@A_Salary

结束

//关闭光标

close mycursor

//取消光标

deallocate mycursor

GO

我想通过上面的评论,我已经知道了光标的整个创建过程。 但是,我们至今仍是抽象的理解。 我们无论学什么知识,都要用在实践中。 这样我们就可以把抽象的东西具体化。

现在,我们运行这个存储过程,看看游标是如何取值的。

打开SQLSERVER2000查询分析器,创建数据库,然后运行存储过程

Exec PK_Test

看看效果吧(图)

在示例中,您会看到游标为每行检索值。 那么,先不要看下一个答案。 在引言部分,我试试刚才能不能把大家的问题留下来解决。

现在写一个解决我留下的问题的存储过程吧

创建进程PK _ salary add

AS

declare@o_idNvarchar(20,@A_Salary float

declaremycursorcursorforselecto _ id,A_Salary from AddSalary

open mycursor

fetch next from mycursor into @O_ID,@A_Salary

while(@@fetch_status=0)

比根

updateoriginsalaryseto _ salary=o _ salary @ a _ salarywhereo _ id=@ o _ id

fetch next from mycursor into @O_ID,@A_Salary

结束

close mycursor

戴尔我的cursor

GO

旧方法是使用查询分析器运行存储过程,并查看结果如何

Exec PK_SalaryAdd

看看效果吧(图)

运行存储过程以验证是否影响了三行中的数据

使用sql语句查看表OriginSalary的当前结果。

1.4结束语

如果你能把本教程读到最后,我会很高兴,但其实这只是光标最基础的应用。 在显示生活逻辑的关系中,可能会有更复杂的光标。 但是我们只有学会走路,才能跑步哦。

详情请访问云服务器、域名注册、虚拟主机的问题,请访问西部数码代理商官方网站: www.chenqinet.cn

相关推荐

后台-系统设置-扩展变量-手机广告位-内容页底部广告位3