版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第十章 SQL Server的程序设计SQL Server 数据库应用技术SQL Server 20002本章主要内容n10.1 批处理与流程控制n10.2 事务处理n10.3 锁机制n10.4 游标SQL Server 2000310.1 批处理与流程控制 通常,服务器端的程序使用SQL语句来编写.一般而言,一个服务器端的程序是由以下一些部分组成:n批n注释n程序中使用的变量n改变批中语句的执行顺序的流程控制语言n错误和消息的处理SQL Server 2000410.1 批处理与流程控制一. 批处理 批处理就是单个或多个批处理就是单个或多个Transact-SQLTransact-SQL语
2、句语句的集合,由用户或应用程序一次性发送给的集合,由用户或应用程序一次性发送给SQL SQL ServerServer解释并执行批处理内的所有语句指令。解释并执行批处理内的所有语句指令。 建立批处理如同编写建立批处理如同编写SQLSQL语句,区别在于它语句,区别在于它是多条语句同时执行的,用是多条语句同时执行的,用GOGO语句作为一个批语句作为一个批处理的结束。处理的结束。 SQL Server 20005一. 批处理n使用批时的几点限制: 1. 大多数的create命令要在单个批中执行,但create database, create table和create index例外 2. 用set
3、语句改变的选项在批结束时生效 3. 在同一个批中不能改变一个表再立即引用其新列.SQL Server 20006n【例10.1】一个批处理的例子use studentgocreate view teacher_info_viewasselect teacher_id,name,tech_title,salaryfrom teacher_infogoselect * from teacher_info_viewgocreate view create view 必须是批处理中唯一的语句必须是批处理中唯一的语句一. 批处理SQL Server 20007n【例10.2】错误例题use studen
4、tgocreate view stud_info_viewasselect stud_id,name from stud_infoinsert into stud_info_view values(0501010211,黄铭)go一. 批处理SQL Server 20008n【例10.3】无效批处理declare stud_var intgoselect stud_var=25goprint stud_vargo一. 批处理SQL Server 20009二. 流程控制n使用T-SQL语言编程的时候,常常要利用各种流程控制语句去进行顺序、分支控制转移、循环等操作。T-SQL提供了一组流程控制语
5、句,包括:条件控制语句、无条件转移语句、循环语句和返回状态值给调用例程的语句n1. BEGINEND1. BEGINEND语句块语句块n2. IFELSE2. IFELSE语句语句n3. CASE3. CASE表达式表达式n4. WHILE4. WHILE语句语句n5. WAITFOR5. WAITFOR语句语句n6. GOTO6. GOTO语句语句n7. 7. RETURNRETURN语句语句SQL Server 200010二. 流程控制- beginend其语法如下:BEGINBEGIN 命令行命令行| |程序块程序块 ENDEND BEGINEND BEGINEND 用来设定一个用来设
6、定一个程序块程序块,将在,将在BEGINEND BEGINEND 内的所有程序视为一个单元执行。内的所有程序视为一个单元执行。 BEGINEND BEGINEND 经常在经常在条件语句条件语句(如(如IFELSEIFELSE)或循环等)或循环等控制流程的语句中使用。控制流程的语句中使用。 在在BEGINEND BEGINEND 中可中可嵌套嵌套另外的另外的BEGINEND BEGINEND 来定义另来定义另一程序块。一程序块。SQL Server 200011二. 流程控制- ifelsenIFELSE语句用来实现选择结构,其语法格式如下:IF (IF (条件表达式条件表达式) ) 命令行命令
7、行| |程序块程序块 ELSE ELSE 命令行或程序块命令行或程序块 其中:v可以是各种表达式的组合,但表达式的值必须是逻辑值“真”或“假”。vELSE 子句是可选的,最简单的IF 语句没有ELSE 子句部分。vIFELSE 用来判断当某一条件成立时执行某段程序,条件不成立时执行另一段程序。v如果不使用程序块,IF 或ELSE 只能执行一条命令。vIF ELSE 可以进行嵌套,最多嵌套32级。 SQL Server 200012二. 流程控制- ifelsen【例10.4】if (select avg(grade) from stud_grade where left(stud_id,8)=
8、04010101) =60begin print passendSQL Server 200013二. 流程控制- ifelsen【例10.5】统计统计20042004级计算机应用技术专业级计算机应用技术专业0202班班的学生人数不超过的学生人数不超过5 5人,则向数据表人,则向数据表stud_infostud_info中中插入新的学生记录插入新的学生记录declare p_total intbegin select p_total=count(*) from stud_info where left(stud_id,8)=04010102 if (p_total560) update stu
9、d_info set mark=mark-5 where year(birthday)=1986endSQL Server 200015二. 流程控制- ifelsen【例10.6】从数据表stud_grade中读出学生陈红的成绩,将百分制转换成等级制显示.declare score numeric(4,1),step char(1)begin select score=grade from stud_grade where name=陈红陈红 if(score=90 and score=80) set step=B else if(score=70) set step=C else if(s
10、core=60) set step=D else set step=E print stepend SQL Server 200016二. 流程控制- case表达式n CASE函数可以计算多个条件式,并将其中一个符合条件的结果表达式返回。CASE函数按照使用形式的不同,可以分为简单CASE表达式和搜索CASE表达式。n【注意】SQL Server 200017二. 流程控制- case表达式n1.简单CASE表达式 将一个测试表达式与一组简单表达式进行比较,如果某个简单表达式与测试表达式的值相等,则返回相应结果表达式的值。其语法格式如下:CASE 测试表达式测试表达式WHEN 测试值测试值1
11、 THEN 结果表达式结果表达式1. WHEN 测试值测试值n THEN 结果表达式结果表达式n ELSE 结果表达式结果表达式m ENDSQL Server 200018二. 流程控制- case表达式n【例10.7】从学生表stud_info中,选取stud_id,gender,如果gender为“男”则输出“M”,如果为“女”输出“F”。select stud_id,sex=case gender when 男男then M when 女女then F endfrom stud_infoSQL Server 200019二. 流程控制- case表达式n2.搜索CASE表达式 与简单表达
12、式不同的是,搜索表达式中,CASE关键字后面不跟任何表达式,在各WHEN关键字后面跟的都是逻辑表达式,其语法格式如下: CASE WHEN 逻辑表达式1 THEN 结果表达式1 WHEN 逻辑表达式n THEN 结果表达式n ELSE 结果表达式结果表达式m ENDSQL Server 200020二. 流程控制- case表达式n【例10.8】从stud_grade表中查询所有同学选课成绩情况,凡成绩为空者输出“未考”、小于60分输出“不及格”、60分至70分输出“及格”、70分至90分输出“良好”、大于或等于90分时输出“优秀”。select stud_id,name,score= cas
13、e when grade is null then 未考未考 when grade=60 and grade=70 and grade=90 then 优秀优秀 endfrom stud_gradeSQL Server 200021二. 流程控制- while语句其语法如下:WHILE (WHILE (条件表达式条件表达式) )BEGINBEGIN 命令行或程序块命令行或程序块 BREAKBREAK CONTINUECONTINUE 命令行或程序块命令行或程序块 ENDEND WHILEWHILE 命令在设定的条件成立时,会重复执行命令行或程序命令在设定的条件成立时,会重复执行命令行或程序块。
14、块。 CONTINUECONTINUE 命令可以让程序跳过命令可以让程序跳过CONTINUE CONTINUE 命令之后的语句,命令之后的语句,回到回到WHILE WHILE 循环的第一行,继续进行下一次循环。循环的第一行,继续进行下一次循环。 BREAKBREAK 命令则让程序完全跳出循环,结束命令则让程序完全跳出循环,结束WHILE WHILE 命令的执行。命令的执行。 WHILEWHILE 语句也可以嵌套。语句也可以嵌套。SQL Server 200022二. 流程控制- while语句n【例10.9】以下程序计算1100之间所有能被3整除的数的个数及总和。declare x small
15、int,y smallint,nums smallintset x=0set y=1set nums=0while (y=100) begin if(y%3=0) begin set x=x+y set nums=nums+1 end set y=y+1 endprint str(x)+,+str(nums)SQL Server 200023二. 流程控制- waitfor其语法如下:WAITFOR WAITFOR DELAYDELAY | | TIMETIME WAITFOR WAITFOR 命令用来暂时停止程序执行,直到所设命令用来暂时停止程序执行,直到所设定的等待时间已过或所设定的时间已
16、到才继续往定的等待时间已过或所设定的时间已到才继续往下执行。下执行。 其中其中时间时间必须为必须为DATETIMEDATETIME 类型的数据,但不类型的数据,但不能包括日期。能包括日期。 各关键字含义如下:各关键字含义如下:1 1DELAYDELAY:用来设定等待的时间段,最多可达用来设定等待的时间段,最多可达24 24 小时小时2 2TIMETIME:用来设定等待结束的时间点用来设定等待结束的时间点SQL Server 200024二. 流程控制- waitforn【例10.10】等待1 小时2 分零3 秒后才执行SELECT 语句。n【例】等到下午 15点零 8分后才执行SELECT语句
17、。waitfor delay 01:02:03 select *from stud_info waitfor time 15:38:00 select * from stud_info SQL Server 200025二. 流程控制- gotonGOTO语句是无条件转移语句,语法格式语句是无条件转移语句,语法格式为:为:GOTO GOTO 标识符标识符 GOTO GOTO 命令用来改变程序执行的流程,使程序跳到命令用来改变程序执行的流程,使程序跳到标有标识符的指定的程序行再继续往下执行。标有标识符的指定的程序行再继续往下执行。 作为跳转目标的作为跳转目标的标识符可为数字与字符的组合标识符可为
18、数字与字符的组合。但必须以但必须以“:”结尾。结尾。 在在GOTO GOTO 命令行,标识符后不必跟命令行,标识符后不必跟“:”SQL Server 200026二. 流程控制- goton【例10.11】求123100的总和。declare sum smallint,i smallintset i=1set sum=0beg: if (i=100) begin set sum=sum+i; set i=i+1 goto beg endprint sumSQL Server 200027二. 流程控制- return语法如下:RETURN RETURN ( 整数值整数值 ) RETURN 命令
19、用于结束当前程序的执行,返回到上一个调用它的程序或其它程序。 在括号内可指定一个返回值。 如果没有指定返回值,SQL Server 系统会根据程序执行的结果返回一个内定值,如右图:如果运行过程产生了多个错误,如果运行过程产生了多个错误,SQL Server SQL Server 系统将返回绝对值系统将返回绝对值最大的数值;最大的数值;如果此时用户定义了返回值,则以返回用户定义的值。如果此时用户定义了返回值,则以返回用户定义的值。RETURN RETURN 语句语句不能返回不能返回NULLNULL值。值。0 0 程序执行成功程序执行成功-1 -1 找不到对象找不到对象-2 -2 数据类型错误数据
20、类型错误-3 -3 死锁死锁-4 -4 违反权限原则违反权限原则-5 -5 语法错误语法错误-6 -6 用户造成的一般错误用户造成的一般错误-7 -7 资源错误如磁盘空间不足资源错误如磁盘空间不足-8 -8 非致命的内部错误非致命的内部错误-9 -9 已达到系统的极限已达到系统的极限-10 -11 -10 -11 致命的内部不一致性错误致命的内部不一致性错误-12 -12 表或指针破坏表或指针破坏-13 -13 数据库破坏数据库破坏-14 -14 硬件错误硬件错误SQL Server 20002810.2 事务处理n一. 事务概述n二. 事务管理n三. 事务模式n四. 事务日志SQL Serv
21、er 200029一. 事务概述 一个一个事务事务是由一系列的对数据库的是由一系列的对数据库的查询查询操作和操作和更新更新操操作构成的。作构成的。 事务是数据库系统中执行的一个工作单位,它是由用事务是数据库系统中执行的一个工作单位,它是由用户定义的一组操作序列。户定义的一组操作序列。 一个事务可以是一组一个事务可以是一组SQLSQL语句、一条语句、一条SQLSQL语句或整个程语句或整个程序,一个应用程序可以包括多个事务。序,一个应用程序可以包括多个事务。 事务的开始与结束可以由用户显式控制。如果用户没事务的开始与结束可以由用户显式控制。如果用户没有显式地定义事务,则由有显式地定义事务,则由DB
22、MSDBMS按照缺省规定自动划分按照缺省规定自动划分事务。在事务。在SQLSQL语言中,定义事务的语句有三条:语言中,定义事务的语句有三条:SQL Server 200030一. 事务概述nBEGIN TRANSACTIONnCOMMITnROLLBACKvBEGIN TRANSACTIONBEGIN TRANSACTION表示事务的开始;表示事务的开始;vCOMMITCOMMIT表示事务的提交,即将事务中所有对数据库的更表示事务的提交,即将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,此时事务正常结束;新写回到磁盘上的物理数据库中去,此时事务正常结束;vROLLBACKROLLBAC
23、K表示事务的回滚,即在事务运行的过程中发生表示事务的回滚,即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的更新操作全部撤销,再回滚到事务开库的所有已完成的更新操作全部撤销,再回滚到事务开始时的状态。始时的状态。 SQL Server 200031一. 事务概述n【例10.12】将student数据库中学生基本信息表stud_info的学号stud_id由0401010811修改为0401010111begin tran stud_transaction update stud_info set stud_i
24、d=0401010111 where stud_id=0401010108 update stud_grade set stud_id=0401010111 where stud_id=0401010108commit tran stud_transaction /*对于显示定义的事务对于显示定义的事务,最后必须提交最后必须提交*/SQL Server 200032一. 事务概述n事务是由有限的数据库操作序列组成,但并不是任意事务是由有限的数据库操作序列组成,但并不是任意的数据库操作序列都能成为事务,为了保护数据的完的数据库操作序列都能成为事务,为了保护数据的完整性,一般要求事务具有以下四个特
25、征:整性,一般要求事务具有以下四个特征:1 1原子性原子性 一个事务是一个不可分割的工作单位,事务在执行时,一个事务是一个不可分割的工作单位,事务在执行时,应该遵守应该遵守“要么不做,要么全做要么不做,要么全做”(nothing or allnothing or all)的原则,即不允许事务部分的完成。的原则,即不允许事务部分的完成。 即使因为故障而使事务未能完成,它执行的部分结果即使因为故障而使事务未能完成,它执行的部分结果要被取消。要被取消。SQL Server 200033一. 事务概述2 2一致性一致性 事务对数据库的作用是数据库从一个一致状态转事务对数据库的作用是数据库从一个一致状态
26、转变到另一个一致状态。变到另一个一致状态。 所谓数据库的一致状态是指数据库中的数据满足所谓数据库的一致状态是指数据库中的数据满足完整性约束。完整性约束。v例如,银行企业中,例如,银行企业中,“从帐号从帐号A A转移资金额转移资金额R R到帐号到帐号B”B”是是一个典型的事务,这个事务包括两个操作,从帐号一个典型的事务,这个事务包括两个操作,从帐号A A中减中减去资金额去资金额R R和在帐号和在帐号B B中增加资金额中增加资金额R R,如果只执行其中一,如果只执行其中一个操作,则数据库处于不一致状态,帐务会出现问题。个操作,则数据库处于不一致状态,帐务会出现问题。也就是说,两个操作要么全做,要么
27、全不做,否则就不也就是说,两个操作要么全做,要么全不做,否则就不能成为事务。能成为事务。 可见事务的一致性与原子性是密切相关的。可见事务的一致性与原子性是密切相关的。SQL Server 200034一. 事务概述3 3隔离性隔离性 如果多个事务并发地执行,应像各个事务独立执行一样,一如果多个事务并发地执行,应像各个事务独立执行一样,一个事务的执行不能被其他事务干扰。个事务的执行不能被其他事务干扰。 即一个事务内部的操作及使用的数据对并发的其他事务是隔即一个事务内部的操作及使用的数据对并发的其他事务是隔离的。离的。 并发控制就是为了保证事务间的隔离性。并发控制就是为了保证事务间的隔离性。4 4
28、持久性持久性 指一个事务一旦提交,它对数据库中数据的改变就应该是持指一个事务一旦提交,它对数据库中数据的改变就应该是持久的,即使数据库因故障而受到破坏,久的,即使数据库因故障而受到破坏,DBMSDBMS也应该能够恢复。也应该能够恢复。总结总结: :事务的这事务的这4 4个特性一般简称为事务的个特性一般简称为事务的ACIDACID特性特性SQL Server 200035二. 事务管理语句n(1) 建立事务建立事务 begin transaction 事务名称事务名称|tran_name_variable with markdescription n(2) commit语句标志事务结束语句标志事
29、务结束 commit tran transaction_name|tran_name_variable 或或 commit workSQL Server 200036二. 事务管理语句n(3) rollback语句语句 rollback tran transaction_name|tran_name_variable| savepoint_name| savepoint_name 或或 rollback workn(4)设置保存点设置保存点 save tran savepoint_nameSQL Server 200037二. 事务管理语句n补充补充:两个可用于事务管理的全局变量两个可用于事务
30、管理的全局变量 error:给出最近一次执行的出错语句引给出最近一次执行的出错语句引发的错误号发的错误号,error为为0表示未出错表示未出错. rowcount:给出受事务中已执行语句给出受事务中已执行语句所影响的数据行数所影响的数据行数SQL Server 200038二. 事务管理语句n【例10.13】declare tranname varchar(20)select tranname=student_manager1begin tran trannamegoupdate stud_grade set grade=grade*0.90 where course_id like %06g
31、ocommit tran trannameSQL Server 200039二. 事务管理语句n【例】begin traninsert stud_grade values(0401010113,王小明王小明,0401010106,80) save tran my_savedelete from stud_grade where name=王小明王小明 rollback tran my_savecommit tranSQL Server 200040二. 事务管理语句n【例10.14】使用事务处理方式对表stud_grade执行更新操作,成功则提交事务,失败则取消事务begin tran stu
32、dent_manager2update stud_grade set grade=round(sqrt(grade)*10,0) where course_id like %06if error!=0 rollback tran student_manager2else commit tran student_manager2SQL Server 200041三. 事务模式n1. 显示事务模式显示事务模式 可以由用户在其中定义事务的启动和结束可以由用户在其中定义事务的启动和结束.n2. 隐式事务模式隐式事务模式 指在当前事务提交或回滚后指在当前事务提交或回滚后,自动启用新事自动启用新事务务.
33、set implicit_tranactions on|offn3. 自动事务模式自动事务模式SQL Server 200042四. 事务日志n用来记录事务的每一次对数据库的更新操作。n1.事务日志的内容n2.事务日志文件(logging)SQL Server 20004310.3 锁机制n 数据库是一个共享资源,允许多个用户程序并行地存取数据库。若对这种并发操作不加以控制就会破坏数据的一致性。 SQL Server 200044一. 锁的概念n 锁作为一种安全机制,用于控制多个用户的并发操作,防止用户读取正在由其他用户更改的数据或者多个用户同时修改同一数据,确保事务的完整性和数据的一致性。n
34、 所谓封锁就是当一个事务在对某个数据对象(可以是数据项、记录、数据集、以至整个数据库)进行操作之前,必须获得相应的锁,以保证数据操作的正确性和一致性。n锁定机制的主要属性是锁的粒度和锁的类型。SQL Server 200045一. 锁的概念-锁的粒度n根据对数据的不同处理,封锁的对象可以是这样一些逻辑单元:字段、记录、表、数据库等。n锁对象的大小称之为锁粒度(Lock Granularity). nSQL Server提供了多种粒度的锁,允许一个事务锁定不同类型的资源。锁的粒度越小,系统允许的并发用户数目就越多,数据库的利用率就越高,但封锁机构复杂,系统开销也就越大。管理锁定所需要的系统资源越
35、多。反之,则相反。为了减少锁的成本,应该根据事务所要执行的任务,合理选择锁的粒度,将资源锁定在适合任务的级别范围内。n由于同时封锁一个记录的概率很小,一般数据库系统都在记录级上进行封锁,以获得更高的并发度。 SQL Server 200046一. 锁的概念-锁的粒度n按照粒度增加的顺序,不同粒度的锁可以锁定的资源如表10.1所示。 表10.1不同粒度的锁可以锁定的资源资源说 明行行锁定,锁定表中的一行数据。键键值锁定,锁定具有索引的行数据。 页页面锁定,锁定8KB的数据页或索引页。 区域区域锁定,锁定8个连续的数据页面或索引页面。数据表表锁定,锁定整个数据表,包括所有数据和索引在内。数据库数据
36、库锁定,锁定整个数据库。 SQL Server 200047一. 锁的概念-锁类型n SQL Server使用不同的锁模式锁定资源,这些锁模式确定了并发事务访问资源的方式。常用的锁模式有:1.排它锁(Exclusive Lock):用于数据修改操作v排它锁又称写锁,简称为排它锁又称写锁,简称为X X锁,其采用的原理是禁止并锁,其采用的原理是禁止并发操作。发操作。v当事务当事务T T对某个数据对象对某个数据对象R R实现实现X X封锁后,其他事务要等封锁后,其他事务要等T T解除解除X X封锁以后,才能对封锁以后,才能对R R进行封锁。这就保证了其他进行封锁。这就保证了其他事务在事务在T T释放
37、释放R R上的锁之前,不能再对上的锁之前,不能再对R R进行操作。进行操作。SQL Server 200048一. 锁的概念-锁类型2.共享锁(Share Lock):用于只读取数据的操作v共享锁又称读锁,共享锁又称读锁,, ,简称为简称为S S锁,其采用的原理是允许其锁,其采用的原理是允许其他用户对同一数据对象进行查询,但不能对该数据对象他用户对同一数据对象进行查询,但不能对该数据对象进行修改。进行修改。v当事务当事务T T对某个数据对象对某个数据对象R R实现实现S S封锁后,其他事务只能对封锁后,其他事务只能对R R加加S S锁,而不能加锁,而不能加X X锁,直到锁,直到T T释放释放R
38、 R上的上的S S锁。锁。v这就保证了其他事务在这就保证了其他事务在T T释放释放R R上的上的S S锁之前,只能读取锁之前,只能读取R R,而不能再对而不能再对R R作任何修改。作任何修改。3修改(Update)锁: 用于可更新的资源中,防止多个会话在读取、锁定及随后可能进行的资源更新时发生常见形式的死锁。SQL Server 200049一. 锁的概念-两段锁协议n 在运用X锁和S锁这两种基本封锁对数据对象加锁时,还需要约定一些规则,如何时申请X锁或S锁,持锁时间和何时释放等。我们称这些规则为封锁协议(Locking Protocol)。对封锁方式规定不同的规则,就形成了各种不同的封锁协议
39、。n 两段封锁协议是最常用的一种封锁协议,理论上已经证明使用两段封锁协议产生的是可串行化调度 (一个事务的运行次序在并行调度执行的结果等价于某一串行调度执行的结果,则称这种调度是可串行化的调度)。两段锁协议是指每个事务的执行可以分为两个阶段:加锁阶段(生长阶段)和 解锁阶段(衰退阶段)。SQL Server 200050一. 锁的概念-两段锁协议n加锁阶段:在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁,在进行写操作之前要申请并获得X锁。加锁不成功,则事务进入等待状态,直到加锁成功才继续执行。n解锁阶段:当事务释放了一个封锁以后,事务进入解锁阶段,在该阶段只能进行解锁操作
40、不能再进行加锁操作。SQL Server 200051一. 锁的概念-两段锁协议n两段封锁法可以这样来实现:事务开始后就处于加锁阶段,一直到执行ROLLBACK和COMMIT之前都是加锁阶段。nROLLBACK和COMMIT使事务进入解锁阶段,即在ROLLBACK和COMMIT模块中DBMS释放所有封锁。SQL Server 200052二. 查看锁的信息n1. 使用企业管理器: 管理-当前活动-锁/进程ID 或 锁/对象n2. 用系统存储过程sp_lock sp_lock spid1= spid1,spid2= spid2 参数说明:SQL Server 200053三. 死锁n 封锁技术的
41、引入能有效解决并发用户的数据一致性问题,但因此可能会引起进程间的死锁问题。 (1)引起死锁的主要原因是: 两个进程已各自锁住一个页,但又要求访问被对方锁住的页。更一般的情况是,一个事务独占了其他事务正在申请的资源,且若干个这样的事务形成一个等待圈。SQL Server 200054三. 死锁(2)死锁的避免 死锁一旦发生,系统效率将会大大下降,因而要尽量避免死锁的发生。同操作系统避免死锁的方法类似,在数据库环境下,常用的方法有:SQLServer能自动发现并解除死锁。当发现死锁时,它会选择其进程累计的CPU时间最少者所对应的用户作为“牺牲者”(令其夭折),以让其他进程能继续执行。然后将被中断的
42、事务回滚,同时SQL Server发送错误号1205(即error=1205)给牺牲者。SQL Server 20005510.4 游标n一. 游标的定义及其优点n二. 使用游标n三. 游标示例SQL Server 200056一. 游标的定义及其优点n 通常情况下,关系数据库中的操作总会对整个记录集产生影响,而在实际应用中,应用程序有时只需要每次处理一条或一部分记录。在这种情况下,就需要使用游标在服务器内部处理结果集.n 游标可视为一种特殊的指针,它与某个查询结果相联系,可以指向结果集的任意位置,以便对指定位置的数据进行处理.使用游标可以在查询数据的同时对数据进行处理.n游标的优点:p253
43、SQL Server 200057二. 使用游标n使用游标的步骤 (1) 声明游标 (2) 打开游标 (3) 从游标的结果集中读取数据 (4) 对游标中的数据逐行操作 (5) 关闭游标 (6) 释放游标SQL Server 200058二. 使用游标-声明游标n游标与局部变量一样,也要先声明后使用。 SQL Server 中,使用游标的第一步是声明游标,声明的内容主要包括游标名称、数据来源、选择条件、游标属性。n命令格式:DECLARE cursor_name scroll CURSOR FOR select_statement FOR READ ONLY | UPDATE OF column
44、_name ,.n n命令说明: (1)scroll:说明所声明的游标可以前滚,后滚,可使用所用的提取选项(first,last,prior,next).如果省略scroll,则只能使用next提取选项SQL Server 200059二. 使用游标-声明游标n (2)select_statement 表示一个SELECT查询语句,它查询的表称为游标的基表,查询的结果称为游标结果集。在游标声明的 select_statement 内必须有from子句,且不允许使用关键字COMPUTE、COMPUTE BY和INTO。 (3)READ ONLY表示所声明的游标为只读的,不得用于DELETE、UP
45、DATE语句。不选此项时,则为可修改游标。 (4)UPDATE表示所声明的游标为可修改游标,后面的OF column_name ,.n 指定允许修改的列,无OF column_name ,.n 选项时表示允许修改所有列。SQL Server 200060二. 使用游标-打开游标n 打开游标就是执行相应的SELECT语句的查询操作,检索多行数据,把所有满足查询条件的数据行组成一个集合,称为游标活动集(Active Set)或结果集,并把游标指针置于其首端。n命令格式: OPEN cursor_name n注意:p254 (1),(2)SQL Server 200061二. 使用游标-推进游标指针
46、并取当前记录n使用游标是指将游标指向(或称“定位于”)游标结果集的某一行,对该行的数据进行提取或修改。游标指向的那一行称为游标的当前行。n 当游标声明被打开后,游标指针位于结果集的第一行之前.n使用游标提取数据只能一次提取结果集的单个行,并可以将游标所指行(当前行)的各列数据转移到指定的变量中。这样,其他 T-SQL 语句就可以引用这些变量来访问已提取的数据值。使用游标语法如下:SQL Server 200062二. 使用游标-推进游标指针并取当前记录 FETCH NEXT|PRIOR|FIRST|LAST| ABSOLUTE n | nvar | RELATIVE n | nvar FROM
47、 游标名称 INTO 变量名,nn命令说明:n(1)NEXT:读取当前游标指针所指向行的下一行数据,并将游标指向该下一行。如果 FETCH NEXT 是对游标的第一次提取操作,则返回结果集中的第一行。NEXT 为默认的游标提取选项。SQL Server 200063二. 使用游标-推进游标指针并取当前记录n(2)PRIOR:读取当前游标指针所指向行的上一行数据,并将游标指向该上一行。如果 FETCH PRIOR 为对游标的第一次提取操作,则没有行返回并且游标仍指向第一行。n(3)FIRST:读取游标结果集的第一行数据并将其作为当前行。n(4)LAST:读取游标结果集的最后一行数据并将其作为当前
48、行。SQL Server 200064二. 使用游标-推进游标指针并取当前记录n(5)ABSOLUTE n | nvar :表示读取游标结果集的第n行数据。 如果n或nvar为正数,则返回从游标结果集第一行开始计算的正数第n行数据,并将返回的行变成新的当前行。 如果n或nvar为负数,则返回从游标结果集第末行开始计算的倒数第n行数据,并将返回的行变成新的当前行。 如果n或nvar为0,则没有行返回。n必须为整型常量且nvar必须为smallint、tinyint或int类型数据。SQL Server 200065二. 使用游标-推进游标指针并取当前记录n(6)RELATIVE n | nvar :如果n或nvar为正数,读取当前行之后的第n行并将返回的行变成新的当前行。如果n或nvar为负数,读取当前行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 施工工序衔接方案
- 实时交易监控技术-第3篇
- 防水工程施工质量提升方案
- 预制构件生产与安装方案
- 污水处理厂设施扩容及管网新增工程节能评估报告
- 燃气工程协调沟通机制
- 城区供水管网改造及压力优化提升项目运营管理方案
- 2026北京中关村第三小学双新分校招聘考试备考试题及答案解析
- 安置小区道路标线施划方案
- 光伏组件清洁与维护方案
- 2025-2030中国金属部分覆盖胆道支架行业市场现状供需分析及投资评估规划分析研究报告
- 抖音账号合作合同协议书
- 卫生间隔断协议书
- 轮机管理题库(助理管轮)
- 餐厅卫生管理制度方案
- 浙江开放大学信息时代的生产技术作业题库
- 猪场产房技术员述职报告
- 2025年独家总经销权合同
- 防爆工具安全操作规程(4篇)
- 中枢系统脱髓鞘病护理
- 城镇排水管道非开挖修复工程可行性研究报告
评论
0/150
提交评论