Sql server 中 游标 具体 实例 介绍: 650) this.width=650;" border="0" alt="" src="http://cdn.verydemo.com/upload/2013_06_18/13714853873760.jpg" /> 650) this.width=650;" border="0" alt="" src="http://cdn.verydemo.com/upload/2013_06_18/137148
Sql server 中 游标 具体 实例 介绍:
650) this.width=650;" border="0" alt="" src="http://cdn.verydemo.com/upload/2013_06_18/13714853873760.jpg" /> 650) this.width=650;" border="0" alt="" src="http://cdn.verydemo.com/upload/2013_06_18/13714853873761.jpg" />
表一 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 语句可以是简单查询,也可以是复杂的接连查询和嵌套查询
例子: [ 已表 2 AddSalary 为例子 ]
Declare mycursor cursor for select * from AddSalary 这样我就对表 AddSalary 申明了一个 游标 mycursor
【高级备注】
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 、 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
Don't Know
查看更多关于MSSQLServer游标及实例(三)的详细内容...