文档章节

sqlserver游标使用和循环

深圳大道
 深圳大道
发布于 2016/12/29 15:36
字数 1091
阅读 1
收藏 0
/***
游标的使用
 讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱。
 使用游标的顺序: 声名游标、打开游标、读取数据、关闭游标、删除游标。
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 实例训练
**/
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

本文转载自:http://blog.csdn.net/smartsmile2012/article/details/41043613

共有 人打赏支持
深圳大道
粉丝 3
博文 877
码字总数 0
作品 0
深圳
架构师
私信 提问
Python操作SQLServer

安装开发环境 要进行SQLServer的开发,首先需要在本机上安装SQLServer,建立本机开发环境。可以从微软官网上下载类似cnsqlserver2012enterpriseeditionwithsp1x86x64dvd_1234493.iso文件,可...

最老程序员闫涛
2018/08/28
0
0
FreeBSD下执行SQL Server2005存储过程解决方案

FreeBSD下执行SQL Server2005存储过程解决方案(Warning: mssql_execute(): ...) FreeBSD下使用SQL Server2005(2008)需要使用FreeTDS。 安装FreeTSD后,使用PHP语言进行测试。在使用mssql_e...

雷xiao雨
2014/03/01
0
0
在Linux上使用mssql-conf工具配置SQL Server 2017

在Linux上使用mssql-conf工具配置SQL Server 2017 mssql-conf是在Linux上安装SQL Server 2017后的一个配置脚本。你可以使用这个实用工具设置以下参数: 使用贴士: l 对于AlwaysOn可用性组和...

UltraSQL
2018/07/30
0
0
在Linux上使用环境变量配置SQL Server设置

你可以使用不同的环境变量在Linux上配置SQL Server 2017。这些变量用于两个场景: 使用mssql-conf setup命令配置初始化设置。 配置一个新的Docker容器中的SQL Server。 环境变量 示例:初始设...

UltraSQL
2018/07/30
0
0
SQLServer 开启远程访问,也可逆向思维进行关闭

为了可以通过TCP/IP协议远程访问SQLServer数据库,需要做以下几点: 在SQLServer所运行的服务器上,我们必须找到SQLServer所侦听的端口然后添加到WIndows防火墙的【允许入站】中。 一:需要添...

easonjim
2015/08/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用Maven打包Docker镜像-Jenkins版

前提:Jenkins服务器上安装好Docker,创建Jenkins任务,配置好代码来源,和Build配置: pom.xml中添加docker-maven-plugin: <plugin> <groupId>com.spotify</groupId> <artifactI......

莫在全
16分钟前
0
0
rabbitmq

灰暗
57分钟前
1
0
Flink

flink HA部署 flink搭建,采用分布式部署方式,分别为A,B,C三个节点。其中A为master;A,B,C为worker。 本文使用的用户是hadoop用户(自己新建) 先决条件 Java 1.8.x or higher scala 自己使用...

-九天-
今天
2
0
数据中台和传统数仓的区别

中台系统把业务层同性的算法能力,服务能力,业务能力高度集成,有效组织 ,动态规划。更好的帮助上层业务。 今天就让我们看看关于数据中台的问答吧。 1 Q : 什么是数据中台? A : 数据中台是...

hblt-j
今天
5
0
Java在什么时候会出现内存泄漏

在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对...

群星纪元
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部