
第10章SQL Server的程序设计 本章将主要介绍包括批处理、流程挖制、事务处理、领、游标在内的Transcat-SQL的 程序设计知识。它们是灵活应用T-SL语句的关键。 10,1批处理与流程控制 10.1.1数处理 数据处理的方式基本上是批处理。所谓批处理是包含一个成多个Transact-SL语句的 组,它将一次性地发送到SOLServer中执行。用G0米通知SQLServer一批Transact--SL 语句的结束。一些S网语句不可以成在一个批处理中进行处理,它们需要遵守以下规则: 大多数CATE金令要在单个批命令中进行,但CREATEDATABASE。CREATETABLE和 CREATEINDE例外, 【101】一个批处理的例子。 USEstudent 00 CREATEVIEVteacher_info_view AS SELECTteacher_id,nane,tech_title,salaryFROMteacher_info 00 SEL.ECT*FRONteacher_info_view 00 因为EATEVIE必须是批处理中的襟一语句,所以需要CO命令将CREATEVIER语句与 其上下的语句SE和SBCT)隔离开米。 【10-2】在数据岸student中列出学生基本信息表stud_info中学号、姓名,其中要求 学号s1udid以“04”开头。 USEstudent SELECTstud id.nameFROMlstud_info HEREstud_idLIKE'O格 00 在查询分析器的运行窗口中运行上面命令后。在运行结束窗口中将返回学号st时d 以“01”开头的所有内容。上述这个查询过程实际上就是一组有效的SL命令组成的批处理
第 10 章 SQL Server 的程序设计 本章将主要介绍包括批处理、流程控制、事务处理、锁、游标在内的 Transcat-SQL 的 程序设计知识,它们是灵活应用 T-SQL 语句的关键。 10.1 批处理与流程控制 10.1.1 批处理 数据处理的方式基本上是批处理。所谓批处理是包含一个或多个 Transact-SQL 语句的 组,它将一次性地发送到 SQLServer 中执行。用 GO 来通知 SQLServer 一批 Transact-SQL 语句的结束。一些 SQL 语句不可以放在一个批处理中进行处理,它们需要遵守以下规则: 大多数 CREATE 命令要在单个批命令中进行,但 CREATEDATABASE,CREATETABLE 和 CREATEINDEX 例外。 【10-1】一个批处理的例子。 USEstudent GO CREATEVIEWteacher_info_view AS SELECTteacher_id,name,tech_title,salaryFROMteacher_info GO SELECT*FROMteacher_info_view GO 因为 CREATEVIEW 必须是批处理中的惟一语句,所以需要 GO 命令将 CREATEVIEW 语句与 其上下的语句(USE 和 SELECT)隔离开来。 【10-2】在数据库 student 中列出学生基本信息表 stud_info 中学号、姓名,其中要求 学号 stud_id 以“04”开头。 USEstudent SELECTstud_id,nameFROMstud_info WHEREstud_idLIKE’04%’ GO 在查询分析器的运行窗口中运行上面命令后,在运行结束窗口中将返回学号 stud_id 以“04”开头的所有内容。上述这个查询过程实际上就是一组有效的 SQL 命令组成的批处理

在程序设计中经常会出现无效的批处理命令,下面是一个无效的批处理的示例。 USEstudent 00 CREATEYIEVstud_info_view AS SELECTstud_id,nameFROMIstud_info INSERTINT0 stud_info_viewVALUES('05010102I1',”黄铭”) 00 在查询分析器的运行窗口中运行上面命◆后,在运行结果窗口中将返回如下消息:“在 关健字S灯附近有语法错误”,这说明第二个批处理是无效的,原因是在于一个数处理中, CREATEVIE围多须是其中的惟一语句,如果在INSERT命令之前加一个GD语句,那么,上述 批处理就可以正常执行了。 【10-3】一个无效的批处理的例子。 DECLARE@stud_varINT 00 SELECTestud_var=25 0 PRINTestud_var 0 图10.1无效批处理的例子 运行结果如图10.1所示,因为stud_var在第一个批处理中定义,但是在第二个批处 理中引用了stud_var,在第三个批处理中又引用stud var,所以运行出错. 101,2流程控制 流程控制语句是通过判断指定的某些值米控制程序运行方向的语句。Transact-S观.语 言使用的流程控制语句与常见的程序设计语言类似,主要有以下儿种拉制命令。 1.BEGIN---END 语法形式:BEGIN[sgl_statenent|statement_block]ND B距GIN.END用来设定一个程序块,将在EGIW…END内的sql_statenent或 statement_block视为一个单元执行,EGIW-D经常在条件语句(如IF-SE中使用, 在EGIN---END中可以帐套另外的G1NEND来定义另一程序块
在程序设计中经常会出现无效的批处理命令,下面是一个无效的批处理的示例。 USEstudent GO CREATEVIEWstud_info_view AS SELECTstud_id,nameFROMstud_info INSERTINTOstud_info_viewVALUES(’0501010211’,’黄铭’) GO 在查询分析器的运行窗口中运行上面命令后,在运行结果窗口中将返回如下消息:“在 关键字 INSERT 附近有语法错误”,这说明第二个批处理是无效的,原因是在于一个批处理中, CREATEVIEW 必须是其中的惟一语句,如果在 INSERT 命令之前加一个 GO 语句,那么,上述 批处理就可以正常执行了。 【10-3】一个无效的批处理的例子。 DECLARE@stud_varINT GO SELECT@stud_var=25 GO PRINT@stud_var GO 图 10.1 无效批处理的例子 运行结果如图 10.1 所示,因为@stud_var 在第一个批处理中定义,但是在第二个批处 理中引用了@stud_var,在第三个批处理中又引用@stud_var,所以运行出错。 10.1.2 流程控制 流程控制语句是通过判断指定的某些值来控制程序运行方向的语句。Transact-SQL 语 言使用的流程控制语句与常见的程序设计语言类似,主要有以下几种控制命令。 1.BEGIN…END 语法形式:BEGIN{sql_statement|statement_block}END BEGIN…END 用来设 定一个 程序 块,将 在 BEGIN…END 内 的 sql_statement 或 statement_block 视为一个单元执行。BEGIN…END 经常在条件语句(如 IF…ELSE)中使用。 在 BEGIN…END 中可以嵌套另外的 BEGIN…END 来定义另一程序块

2.IF--ELSE 语法形式: IF(condution_expression)(sql_statementlstatement_block [EL.SE(sql_statementlstatenent_block 其中:condution_expression为条件表达式,可以是各种表达式的组合,但表达式的 值必须是泛辑值“真”成“假”,风SE子句是可这的,最简单的F语句没有S泥子句部分。 1下SE用米判断当某一条件成立时执行某段程序,条件不成立时执行另一段程序。如果 不使用程序块staterent_block,IF或LSE贝能执行一条命令行sgl_statenent..IFELSE 可以进行藏套。在Transact-SgL.中最多可嵌套32级。 【10-4】从stud_grade数据表中求出2004级计算机工程系计算机应用技术专业01班 学生的平均成绩,如果此平均成领大于或等于60分,则输出“阳55”信息。 IF (SELECTAVG(xrade)FROMstud_gradeNHERELEFT(stud_id,8)='04010101')>=60 BEGIN PRINT'pass' END 【10-5】统计2004缓计算机工程系计算机应用技术专业②班的学生人数,如果不超过 45人。则向数据表std_1nfo中加入新的学生记录。 DECLAREEp_totalINT BEGIN SELECTep_total-COUNT()FROMstud_infoWHERELEFT(stud_id,8)='04010102' IF(@p_total<45) INSERTINTOstud_info ¥.ES(”0401010245”,’谢疗光',’05-14-1986”,’男”,’广东省湛江市”, ·0789-4526345”,514020°,565) END 【106】从数据表stud_grade中读出学生陈红的成境,将百分制转换成等级制, DECLAREescoreNMERIC(4.1),estepCHAR (1) BEGIN /体从关系stud_grade中读出学生陈红的一个成绩送变量scoc*/ S8,ECTescore=cradeFROMIstud_gradeNHEREna='陈红
2.IF…ELSE 语法形式: IF(condution_expression){sql_statement|statement_block} [ELSE{sql_statement|statement_block}] 其中:condution_expression 为条件表达式,可以是各种表达式的组合,但表达式的 值必须是逻辑值“真”或“假”。ELSE 子句是可选的,最简单的 IF 语句没有 ELSE 子句部分。 IF…ELSE 用来判断当某一条件成立时执行某段程序,条件不成立时执行另一段程序。如果 不使用程序块 statement_block,IF 或 ELSE 只能执行一条命令行 sql_statement。IFELSE 可以进行嵌套,在 Transact-SQL 中最多可嵌套 32 级。 【10-4】从 stud_grade 数据表中求出 2004 级计算机工程系计算机应用技术专业 01 班 学生的平均成绩,如果此平均成绩大于或等于 60 分,则输出“pass”信息。 IF(SELECTAVG(grade)FROMstud_gradeWHERELEFT(stud_id,8)=’04010101’)>=60 BEGIN PRINT’pass’ END 【10-5】统计 2004 级计算机工程系计算机应用技术专业 02 班的学生人数,如果不超过 45 人,则向数据表 stud_info 中加入新的学生记录。 DECLARE@p_totalINT BEGIN SELECT@p_total=COUNT(*)FROMstud_infoWHERELEFT(stud_id,8)=’04010102’ IF(@p_total<45) INSERTINTOstud_info VALUES(’0401010245’,’谢背光’,’05-14-1986’,’男’,’广东省湛江市’, ’0789-4526345’,’514020’,565) END 【10-6】从数据表 stud_grade 中读出学生陈红的成绩,将百分制转换成等级制。 DECLARE@scoreNUMERIC(4,1),@stepCHAR(1) BEGIN /*从关系 stud_grade 中读出学生陈红的一个成绩送变量@score*/ SELECT@score=gradeFROMstud_gradeWHEREname=’陈红’

IF(score>-90ANDEscore-80)5 ETestep=”B' 包sEIF(score)-70)5 ETestep”C ELSEIF(escore>=60)SETestep='D' ELSESETestep='E' PRINT@step END 3.CASE CSE命令有两种语句格式. 语法形式I:CASEexpression WHENexpression_11THENexpression_12 HENexpression_nlTHENexpression n2 [ELSEexpression_m] END 该语句的执行过程是:将CASE后面表达式的值与各EN子句中的表达式的值述行比较, 如果两者相等,则返回后的表达式的值,然后钱出CSE语句,否则运回包SE子句中 的表达式的值,目SE子句是可选项。当CSE语句中不包含且SE子句时。如果所有比较失 收时,CASE语句将返回L, 【10-7】从数据表std1nfo中,选取stud_id,ad0,如果rade为“男”则输出 “”,如果为“女”输出“F”。 SELECTstud_id,sex=CASEgender '男”THEN”' HX'女”THEN”F END FROMstud_info 话法形式2:CASENHENcondition_expression_1 THENexpression_I WHENcondition_expression_nTHENexpression_n [ELSEexpression_m]
IF(@score>=90AND@score=80)SET@step=’B’ ELSEIF(@score>=70)SET@step=’C’ ELSEIF(@score>=60)SET@step=’D’ ELSESET@step=’E’ PRINT@step END 3.CASE CASE 命令有两种语句格式。 语法形式 1:CASEexpression WHENexpression_11THENexpression_12 … WHENexpression_n1THENexpression_n2 [ELSEexpression_m] END 该语句的执行过程是:将CASE后面表达式的值与各WHEN子句中的表达式的值进行比较, 如果两者相等,则返回 THEN 后的表达式的值,然后跳出 CASE 语句,否则返回 ELSE 子句中 的表达式的值。ELSE 子句是可选项。当 CASE 语句中不包含 ELSE 子句时,如果所有比较失 败时,CASE 语句将返回 NULL。 【10-7】从数据表 stud_info 中,选取 stud_id、grade,如果 grade 为“男”则输出 “M”,如果为“女”输出“F”。 SELECTstud_id,sex=CASEgender WHEN’男’THEN’M’ WHEN’女’THEN’F’ END FROMstud_info 语法形式 2:CASEWHENcondition_expression_1THENexpression_1 … WHENcondition_expression_nTHENexpression_n [ELSEexpression_m]

END 该语句的执行过程是:首先测试飞后的条件表达式的值,如果其值为真,则返国W 后面的表达式的值,否则测试下一个X子句中的表达式的植,如果所有HEX子句后的表 达式的值都为假,则返目SE后的表达式的值,如果在CASE语句中没有ESE子句,则CSE 表达式返国山 注意:CASE命◆可以联套到SL语句中。 【10-8】从stud_grade表中查询所有同学考试成锁情况,凡成锁为空者输出“未考”、 小于0分输出“不及格、60分至0分输出“及格”,0分至90分输出“良好”.大于或 等于90分时输出“优秀。 SELECTstud_id,nate,score=CASEWHENgradeISMULLTHEN'' EXgrade(60T”不及格' HENgrade>=0 grade=7 OANDgrade(90THEN”良好' ENgrade>-90HE优秀' END FRMstud_grade 4.VHILE---CONTINUE---BREAK 语法形式: WHILEcondition_expression BEGIN [sql_staterentlstatement_block) [BREAK] [CONTINUE] [sql_statementlstatement_block) w 阳E命令在设定的条件成立时,会重复执行命令行成程序块,CONTINUE命令可以让程 序跳过CONTINUE命令之后的语句,回到HILE循环的第一行,雕线进行下一次循环。EK 命令则让程序完全洗出循环,结束E命令的执行。E语句也可以嵌套, 【10-9】以下程序计算1`100之阿所有能被3整除的数的个数及总和, DECLAREExSMALLINT,eySMALLINT,@numsSMALLINT
END 该语句的执行过程是:首先测试 WHEN 后的条件表达式的值,如果其值为真,则返回 THEN 后面的表达式的值,否则测试下一个 WHEN 子句中的表达式的值,如果所有 WHEN 子句后的表 达式的值都为假,则返回 ELSE 后的表达式的值,如果在 CASE 语句中没有 ELSE 子句,则 CASE 表达式返回 NULL。 注意:CASE 命令可以嵌套到 SQL 语句中。 【10-8】从 stud_grade 表中查询所有同学考试成绩情况,凡成绩为空者输出“未考”、 小于 60 分输出“不及格”、60 分至 70 分输出“及格”、70 分至 90 分输出“良好”、大于或 等于 90 分时输出“优秀”。 SELECTstud_id,name,score=CASEWHENgradeISNULLTHEN’未考’ WHENgrade=60ANDgrade=70ANDgrade=90THEN’优秀’ END FROMstud_grade 4.WHILE…CONTINUE…BREAK 语法形式: WHILEcondition_expression BEGIN {sql_statement|statement_block} [BREAK] [CONTINUE] {sql_statement|statement_block} END WHILE 命令在设定的条件成立时,会重复执行命令行或程序块。CONTINUE 命令可以让程 序跳过 CONTINUE 命令之后的语句,回到 WHILE 循环的第一行,继续进行下一次循环。BREAK 命令则让程序完全跳出循环,结束 WHILE 命令的执行。WHILE 语句也可以嵌套。 【10-9】以下程序计算 1~100 之间所有能被 3 整除的数的个数及总和。 DECLARE@xSMALLINT,@ySMALLINT,@numsSMALLINT

SET@x=0 SET@y-l SETenuns=0 用1E((-1000 BEGIN IF (ey3=0) B既G1N SETx-红+y SETEnuns-enuns+1 END SETly-0y+l END PRINTstr(ex)+',+str (enums) 5.WAITFOR 语法形式:ITFOR (DELAY'time'|TIE'tie'】 AIT嫩命令用来署时停止程序执行,直到所设定的等特时间己过成所设定的时间己到 才滋续往下执行。其中·t1m”必须为D以TETI妮类型的数据,但不能包括日瓶,其中,旧AY 用来设定等棒的时间,最多可达24小时:TE用米设定等特结束的时同点。 【10-10】等特1小时2分零3秒后才执行SCT语句。 WAITFORDELAY'01:02:03'SELECT*FROOIstud_info 6.G0T0 语法形式:GOTOlabe 们阳命◆用米改变程序执行的流程,使程序跳到标有标识符的指定的程序行再推续往 下执行。作为珠转目标的标识符可为数字与字符的组合。但必须以“:”结尾。在G0D金令 行,标识符后不必果“:“ 【10-11】求1*2+3++100的总和. DECLAREeSUnSMALLINT.eiSMALLINT SETei=1 SE2T0su■0 BEG:
SET@x=0 SET@y=1 SET@nums=0 WHILE(@y<=100) BEGIN IF(@y%3=0) BEGIN SET@x=@x+@y SET@nums=@nums+1 END SET@y=@y+1 END PRINTstr(@x)+’,’+str(@nums) 5.WAITFOR 语法形式:WAITFOR{DELAY’time’|TIME’time’} WAITFOR 命令用来暂时停止程序执行,直到所设定的等待时间已过或所设定的时间已到 才继续往下执行。其中‘time’必须为 DATETIME 类型的数据,但不能包括日期。其中,DELAY 用来设定等待的时间,最多可达 24 小时;TIME 用来设定等待结束的时间点。 【10-10】等待 1 小时 2 分零 3 秒后才执行 SELECT 语句。 WAITFORDELAY’01:02:03’SELECT*FROMstud_info 6.GOTO 语法形式:GOTOlabel GOTO 命令用来改变程序执行的流程,使程序跳到标有标识符的指定的程序行再继续往 下执行。作为跳转目标的标识符可为数字与字符的组合。但必须以“:”结尾。在 GOTO 命令 行,标识符后不必跟“:” 【10-11】求 1+2+3+…+100 的总和。 DECLARE@sumSMALLINT,@iSMALLINT SET@i=1 SET@sum=0 BEG:

IF(ei(-100) B既GIN SET@sum一4 sumtei SE打ei-ei+1 GOTOBEG w P豫INT■ 7.RETURN 语法形式:ET[integer_.expression] TN命令用于结束当前程序的执行,返国到上一个调用它的程序域其它程序,在括 号内可指定一个返目值。如果没有指定返回值,SOLServer系统会根据程序执行的结果返回 一个内定值,例如:0表示程序执行成功:一1表示找不到对象:一2表示数据类型错误:-3 表示死锁:4表示违反权限原则:5表示语法错谈:6表示用户造成的一般错误:-7表示 资源错溪如磁盘空何不足:一8表示非致命的内部错误:9表示己达到系统的极限:-10一11 表示致命的内部不一致性错误:一2表示表或指针破坏:一13表示数据岸破坏:-14表示硬 件情误。 如果运行过程产生了多个错误,SQLServer系统将返国绝对值最大的数值:如果此时用 户定文了返日值,则以返国用户定义的值,ET脑语句不能返同山.值。 10.2事务处理 10.2.1事务概述 1.事务的概念 一个事务是由一系列的数据库查询操作和更新操作构成的。从用户的观点来看,根据业 务规则,这些操作是一个整体,不陵分制,即要么所有的操作都顺利完成,要么一个也不要 微。绝不能只完成了部分操作,而还有一些操作没有完成。事务是数据库运行中的一个亚辑 工作单位,由心中的事务管理子系统负责事务的处理。 【10-l2】将student数据库中学生基本信息表(stud_info)的学号stud_id由 0401010811修政为0M01010111. 因为学号出现在学生基本信息表(stud1nfo),学生成绩表(stud_grade)中,所以要将 两个表中的学号都修改,而不隆只修政其中的一个表。用户必须通知S刘LServer,通知的方 法是将下面的两个FD4T正语句定文成一个事务。通过事务来保证student数据岸中表
IF(@i<=100) BEGIN SET@sum=@sum+@i SET@i=@i+1 GOTOBEG END PRINT@sum 7.RETURN 语法形式:RETURN[integer_expression] RETURN 命令用于结束当前程序的执行,返回到上一个调用它的程序或其它程序。在括 号内可指定一个返回值。如果没有指定返回值,SQLServer 系统会根据程序执行的结果返回 一个内定值,例如:0 表示程序执行成功;-1 表示找不到对象;-2 表示数据类型错误;-3 表示死锁;-4 表示违反权限原则;-5 表示语法错误;-6 表示用户造成的一般错误;-7 表示 资源错误如磁盘空间不足;-8 表示非致命的内部错误;-9 表示已达到系统的极限;-10-11 表示致命的内部不一致性错误;-12 表示表或指针破坏;-13 表示数据库破坏;-14 表示硬 件错误。 如果运行过程产生了多个错误,SQLServer 系统将返回绝对值最大的数值;如果此时用 户定义了返回值,则以返回用户定义的值。RETURN 语句不能返回 NULL 值。 10.2 事务处理 10.2.1 事务概述 1.事务的概念 一个事务是由一系列的数据库查询操作和更新操作构成的。从用户的观点来看,根据业 务规则,这些操作是一个整体,不能分割,即要么所有的操作都顺利完成,要么一个也不要 做。绝不能只完成了部分操作,而还有一些操作没有完成。事务是数据库运行中的一个逻辑 工作单位,由 DBMS 中的事务管理子系统负责事务的处理。 【10-12】将 student 数据库中学生基本信息表(stud_info)的学号 stud_id 由 0401010811 修改为 0401010111。 因为学号出现在学生基本信息表(stud_info),学生成绩表(stud_grade)中,所以要将 两个表中的学号都修改,而不能只修改其中的一个表。用户必须通知 SQLServer,通知的方 法是将下面的两个 UPDATE 语句定义成一个事务。通过事务来保证 student 数据库中表

stud_info和stud_grade的学号stud1d同时修政,以达到数据保转一致性的目的。 USEstudent 00 BEGINTRANstud_transaction-一开始一个事务 UPDATEstud_idSETstud_id='0401010111'WHEREcourse_id='0401010108' UPDATEstud_gradeSETstud_id='0401010111'WHEREcourse_id='0401010108' COMNITTR4 Nstud_transaction一提交事务 2事务的特性 事务作为一个泛辑工作单元,其中包括一系列的操作,这些语句将被作为一个整体进行 处理。当事务执行遇到情误时,将取清事务做的所有操作。 (I)原子性(tonicity) 一个事务中的所有操作是一个辑上不可分制的单位。事务必頸作为工作的最小单位, 即原子单位,其所透行的操作要么全部执行,要么全部不执行。 (2②一玫性(Consistency) 事务结束时,必须使所有数据处于一致性状态,数据库处于一致性状老是指数据库中的 数据诱足各种完整性规则。在相关数据库中,事务必须遵守数据库的的束和规则要求,以佩 持所有数据的完整性。 (3)隔离性(1 solation) 为了提高事务的吞吐率,大多数5允许同时执行多个事务,就像分时操作系统为了 充分利用系统资源,同时执行多个进程一样。一个事务所作的修政必须与其他事务所作的修 改隔离。事务查看数据所处的状态,要么是另一并发事务隆改它之前的状态,要么是另一事 务修改它之后的状态,事务不会查看中间状态的数据。 (4持久性Durabi1ity) 一个事务一旦完成了全部操作,它对数据库的所有更新操作的结果应反映到数据库中。 事务完成后,其对数据库的修改将水久保特。 事务的这4个特性一般简称为事务的CD特性,可以说对数据库中的数据保护是围饶 着实现事务的特性而达到的。 10.2.2事务管理 1.事务管理语句 (I)使用BEGINTRANSACTION语句建立事务
stud_info 和 stud_grade 的学号 stud_id 同时修改,以达到数据保持一致性的目的。 USEstudent GO BEGINTRANstud_transaction--开始一个事务 UPDATEstud_idSETstud_id=’0401010111’WHEREcourse_id=’0401010108’ UPDATEstud_gradeSETstud_id=’0401010111’WHEREcourse_id=’0401010108’ COMMITTRANstud_transaction--提交事务 2.事务的特性 事务作为一个逻辑工作单元,其中包括一系列的操作,这些语句将被作为一个整体进行 处理。当事务执行遇到错误时,将取消事务做的所有操作。 ⑴原子性(Atomicity) 一个事务中的所有操作是一个逻辑上不可分割的单位。事务必须作为工作的最小单位, 即原子单位,其所进行的操作要么全部执行,要么全部不执行。 ⑵一致性(Consistency) 事务结束时,必须使所有数据处于一致性状态。数据库处于一致性状态是指数据库中的 数据满足各种完整性规则。在相关数据库中,事务必须遵守数据库的约束和规则要求,以保 持所有数据的完整性。 ⑶隔离性(Isolation) 为了提高事务的吞吐率,大多数 DBMS 允许同时执行多个事务,就像分时操作系统为了 充分利用系统资源,同时执行多个进程一样。一个事务所作的修改必须与其他事务所作的修 改隔离。事务查看数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事 务修改它之后的状态,事务不会查看中间状态的数据。 ⑷持久性(Durability) 一个事务一旦完成了全部操作,它对数据库的所有更新操作的结果应反映到数据库中。 事务完成后,其对数据库的修改将永久保持。 事务的这 4 个特性一般简称为事务的 ACID 特性,可以说对数据库中的数据保护是围绕 着实现事务的特性而达到的。 10.2.2 事务管理 1.事务管理语句 ⑴使用 BEGINTRANSACTION 语句建立事务

BEGINTRAN[SACTION] [transaction_namel@tran_nane_variable[WITHMARK['description']] 一个事务是由若干条S语句组成。一般米说,用户向W5提交的第一条SL语句开 始一个新事务,事务的最后一条SqL语句是0WTT或1B语句,表示一个事务的结束 和新事务的开始。特别地,像一条CREATETABLE或C4WT语句就构成一个事务。这里, BEGINTRAN[SACTION)是提供定义显式事务开始的语句。 (白使用COMMITTRANSACT1ON吾句标识事务结束 COAMMIT[TRAN [SACTION][transaction_nane@tran_nane_variable]] 事务结束后没有遇到情误,事务中的所有数据修改在数据库中都将水久有效,占用的废 源将被释政。 (3)使用0OWIO那语句标识事务结束 COIMIT[WORK] 表示一个事务的正常结束。该语句成功执行后,SL5 Server将从上一个事务结束后到该 语句之间的所有5观语句对数据库的操作保存到数据库中。 ()使用O山BC家TR区CTIN语句国滚到事务的指定点 BOLLBACK[TRAN[SACTION] [transaction_name @ tran_name_variablelsavepoint_namel @ savepoint_variable]] 事务执行过程中遇到错误,修政的所有数据都核日滚到事务指定位置的状态,占用的资 源将被释放。 (O使用OLBC0然语句回滚到事务的起点 ROLLBACK[VORK] 表示一个事务的非正常结束。i该语句执行后,Sq网S©r将从上一个事务结束后到该语 句之何的所有SL语句对数据库的操作激消掉,数据库恢复到事务执行前的状态。 使用SAVETRANSACTION语句设置保存点 SAVE[TRAN[SACTION][savepoint_nane] SSr允许在事务处理上设置保存点。保存点允许在一个事务处理内部做些工作, 而后基于特定条件目滚这些工作。保存点(savepoint_nane)类似于C断言中的C00语句的 标号 2参数说明
BEGINTRAN[SACTION] [transaction_name|@tran_name_variable[WITHMARK[’description’]]] 一个事务是由若干条 SQL 语句组成。一般来说,用户向 DBMS 提交的第一条 SQL 语句开 始一个新事务,事务的最后一条 SQL 语句是 COMMIT 或 ROLLBACK 语句,表示一个事务的结束 和新事务的开始。特别地,像一条 CREATETABLE 或 GRANT 语句就构成一个事务。这里, BEGINTRAN[SACTION]是提供定义显式事务开始的语句。 ⑵使用 COMMITTRANSACTION 语句标识事务结束 COMMIT[TRAN[SACTION][transaction_name|@tran_name_variable]] 事务结束后没有遇到错误,事务中的所有数据修改在数据库中都将永久有效,占用的资 源将被释放。 ⑶使用 COMMITWORK 语句标识事务结束 COMMIT[WORK] 表示一个事务的正常结束。该语句成功执行后,SQLServer 将从上一个事务结束后到该 语句之间的所有 SQL 语句对数据库的操作保存到数据库中。 ⑷使用 ROLLBACKTRANSACTION 语句回滚到事务的指定点 ROLLBACK[TRAN[SACTION] [transaction_name| @ tran_name_variable|savepoint_name| @ savepoint_variable]] 事务执行过程中遇到错误,修改的所有数据都被回滚到事务指定位置的状态,占用的资 源将被释放。 ⑸使用 ROLLBACKWORK 语句回滚到事务的起点 ROLLBACK[WORK] 表示一个事务的非正常结束。该语句执行后,SQLServer 将从上一个事务结束后到该语 句之间的所有 SQL 语句对数据库的操作撤消掉,数据库恢复到事务执行前的状态。 ⑹使用 SAVETRANSACTION 语句设置保存点 SAVE[TRAN[SACTION][savepoint_name] SQLServer 允许在事务处理上设置保存点。保存点允许在一个事务处理内部做些工作, 而后基于特定条件回滚这些工作。保存点(savepoint_name)类似于 C 语言中的 GOTO 语句的 标号。 2.参数说明

①transaction_name是分配给事务的名称. ②@tran_nane_variable是用户定义的、含有事务名称的变量名称。必须用char、 varchar、nchar或nvarchar数据类型声明该变量. ③ITHW愿['description']指定在日志中标记事务。description是描述该标记的 字符串。如果使用了I然,则必须指定事务名。 ①savepoint_nane是在事务内建立的一个保存点标记. 同@savepoint_variable是用户定义的,含有保存点名称的变量名称,必须月char、 varchar,ncar或nvarchar数据类型声明该变量。 3简单例子 【10-I3】金名一个事务studest_managerl,事务将为课程号最后两位为06的多螺体 技术误程,所有学生成领折扣1叭。 USEstudent CO DECLAREetrannameVARCHAR (20) SELECTetrannane='student_managerl' BEGINTRANtranmame 00 UPDATEstud_gradeSETgrade=grade*0.90HEREcourse_idl.IKE'$6' CO COM(VITTRANetramnane 【10I4】使用事务处理方式对表stud_grade执行更新操作,成功则提交事务,失败测 取消事务。 USEstudent 0 BEGINTRANstudent_manager2 UPDATEstud_grade SETgrade=BOUND (SQRT(grade)*10,0)WHEREcourse_idl.IKE'$06' IFeR0级!=0 ROLLBACKTRANstudent_manager2 ELSE
①transaction_name 是分配给事务的名称。 ②@tran_name_variable 是用户定义的、含有事务名称的变量名称。必须用 char、 varchar、nchar 或 nvarchar 数据类型声明该变量。 ③WITHMARK[’description’]指定在日志中标记事务。description 是描述该标记的 字符串。如果使用了 WITHMARK,则必须指定事务名。 ④savepoint_name 是在事务内建立的一个保存点标记。 ⑤@savepoint_variable 是用户定义的、含有保存点名称的变量名称。必须用 char、 varchar、nchar 或 nvarchar 数据类型声明该变量。 3.简单例子 【10-13】命名一个事务 student_manager1,事务将为课程号最后两位为 06 的多媒体 技术课程、所有学生成绩折扣 10%。 USEstudent GO DECLARE@trannameVARCHAR(20) SELECT@tranname=’student_manager1’ BEGINTRAN@tranname GO UPDATEstud_gradeSETgrade=grade*0.90WHEREcourse_idLIKE’%06’ GO COMMITTRAN@tranname 【10-14】使用事务处理方式对表 stud_grade 执行更新操作,成功则提交事务,失败则 取消事务。 USEstudent GO BEGINTRANstudent_manager2 UPDATEstud_grade SETgrade=ROUND(SQRT(grade)*10,0)WHEREcourse_idLIKE’%06’ IF@@ERROR!=0 ROLLBACKTRANstudent_manager2 ELSE