第十一章 SQL Server2005程序设计_第1页
第十一章 SQL Server2005程序设计_第2页
第十一章 SQL Server2005程序设计_第3页
第十一章 SQL Server2005程序设计_第4页
第十一章 SQL Server2005程序设计_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十一章第十一章 SQL ServerSQL Server程序设计程序设计11.1 11.1 程序中的批处理、脚本、注释程序中的批处理、脚本、注释11.2 11.2 程序中的事务程序中的事务11.3 SQL Server11.3 SQL Server变量变量11.4 SQL11.4 SQL语言流程控制语言流程控制 11.5 11.5 应用举例应用举例 练练 习习 题题 第十一章第十一章 SQL ServerSQL Server程序设计程序设计SQL Server中的编程语言就是中的编程语言就是T-SQL语言,语言,这是一种非过程化的语言。不论是普通的这是一种非过程化的语言。不论是普通的Clie

2、nt/ Server应用程序,还是应用程序,还是Web应用程应用程序,都必须通过向服务器发送序,都必须通过向服务器发送T-SQL语言才语言才能实现与能实现与SQL Server的通信。用户可以使用的通信。用户可以使用T-SQL语言定义过程,用于存储以后经常使语言定义过程,用于存储以后经常使用的操作。用的操作。 11.1 程序中的批处理、脚本、注释程序中的批处理、脚本、注释 11.1.1 批处理 11.1.2 脚本 11.1.3 注释第十一章 SQL Server程序设计有些任务不能由单独的有些任务不能由单独的T-SQL语句来完成,语句来完成,这时就要使用这时就要使用SQL Server的批处理

3、脚本、存的批处理脚本、存储过程、触发器等来组织多条储过程、触发器等来组织多条T-SQL语句来语句来完成。本节主要介绍批处理、脚本等基本概完成。本节主要介绍批处理、脚本等基本概念。念。11.1.1 批处理 批处理就是一个或多个T-SQL语句的集合,从应用程序一次性发送到SQL Server并由SOL Server编译成一个可执行单元,此单元称为执行计划。执行计划中的语句每次执行一条。 建立批处理时,使用GO语句作为批处理的结束标记。在一个GO语句行中不能包括其他T-SQL语句,但可以使用注释文字。当编译器读取到GO语句时,它会把GO语句前面所有的语句当做一个批处理,并将这些语句打包发送给服务器。

4、GO语句本身并不是T-SQL语句的组成部分,它只是一个用于表示批处理结束的指令。如果在一个批处理中包含语法错误,如引用了一个并不存在的对象,则整个批处理就不能被成功地编译和执行。如果一个批处理中某句有执行错误,如违反了约束,它仅影响该语句的执行,并不影响批处理中其他语句的执行。 建立批处理时,应当注意以下几点:CREATE DEFAULT,CREATE PROCEDURE,CREATE RULE,CREATE TRIGGER 及CREATE VIEW语句不能与其他语句放在一个批处理中。不能在删除一个对象之后,在同一批处理中再次引用这个对象。不能在一个批处理中引用其他批处理中所定义的变量。不能把

5、规则和默认值绑定到表字段或用户自定义数据类型之后,立即在同一个批处理中使用它们。不能定义一个CHECK约束之后,立即在同一个批处理中使用该约束。不能在修改表中的一个字段名之后,立即在同一个批处理中引用新字段名。如果一个批处理中的第一个语句是执行某个存储过程的EXECUTE语句,则EXECUTE关键字可以省略;如果该语句不是第一个语句,则必须使用EXECUTE关键字,EXECUTE可以省写为“EXEC”。【例【例11.1】利用查询分析器执行两个批处理,用来显示系部表中的信息及记录个数。利用查询分析器执行两个批处理,用来显示系部表中的信息及记录个数。 代码如下:USE studentGOPRINT

6、 系部表包含如下信息:SELECT * FROM 系部PRINT 系部表记录个数为:SELECT COUNT(*) FROM 系部GO 该例子中包含两个批处理,前者仅包含一个语句,后者包含四个语句,其中,PRINT语句用于显示char、varchar类型,或可自动转换为字符串类型的数据。运行结果如图1l-1所示。 图图11-1 在查询分析器中执行批处理在查询分析器中执行批处理 11.1.2 脚本脚本 脚本是以文件存储的一系列SQL语句,即一系列按顺序提交的批处理。 T-SQL脚本中可以包含一个或多个批处理。GO语句是批处理结束的标志。如果没有GO语句,则将它作为单个批处理行。 脚本可以在查询分

7、析器中执行,也可以在isql或osql实用程序中执行。查询分析器是建立、编辑和使用脚本的一个最好的环境。在查询分析器中,不仅可以新建、保存、打开脚本文件,而且可以输入和修改T-SQL语句,还可以通过执行T-SQL语句来查看脚本的运行结果,从而检验脚本内容是否正确。11.1.3 注释注释 注释是指程序中用来说明程序内容的语句,它不能执行且不参与程序的编译。注释用于语句代码的说明,或暂时禁用的部分语句。为程序加上注释不仅能增强程序的可读性,而且有助于日后的管理和维护,在程序中使用注释是一个程序员良好的编程习惯。SQL Server支持两种形式的注释语句。1. 行内注释如果整行都是注释而并非所要执行

8、的程序行,则该行可用行内注释,语法格式为:-注释语句。 这种注释形式用来对一行加以注释,可以与要执行的代码处在同一行,也可以另起一行。从双连字符(-)开始到行尾均为注释。 2块注释 如果所加的注释内容较长,则可使用块注释,浯法格式为:/*注释语句* 这种注释形式用来对多行加以注释,可以与要执行的代码处在同一行,也可以另起一行,甚至可以放在可执行代码内。对于多行注释,必须使用开始注释字符对(/*)开始注释,使用结束注释字符对(*)结束注释,“/*”和“*”之间的全部内容都是注释部分。注意:整个注释必须包含在一个批 处理中,多行注释不能跨越批处理。【例11.2】注释语句举例。/* 注释语句应用示例

9、 */USE studentGOSELECT * FROM 学生-检索所有学生的情况GO11.2 程序中的事务 11.2.1 事务概述 11.2.2 事务处理语句 11.2.3 分布式事务 11.2.4 锁定 11.2 程序中的事务程序中的事务 事务是SQL Server中的执行单元,它由一系列T-SQL语句组 成。这个执行单元要么成功完成所有操作,要么就是失败, 并将所做的一切复原。我们主要讨论SQL Server 2005中的 事务机制。 11.2.1 事务概述事务概述 由于事务的执行机制,确保了数据能够正确地被修改,避免造成数据只修改一部分而导致数据不完整,或是在修改途中受到其他用户的干

10、扰。事务有4个原则,统称ACID原则。原子性原子性(Atomic)。事务是原子的,要么完成整个操作,要么退出所有操作。如果某语句失败,则所有作为事务一部分的语句都不会运行。一致性一致性(ConDemoltent)。在事务完成或失败时,要求数据库处于一致状态。由事务 引发的从一种状态到另一种状态的变化是一致的。隔离性隔离性(Isolated)。事务是独立的。它不与数据库的其他事务交互或冲突。持久性持久性(Durable)。事务是持久的,是因为在事务完成后它无须考虑和数据库发生的任何事情。如果系统突然掉电或数据库服务器崩溃,事务保证在服务器重启后仍是完整的。事务可分为两种类型:系统提供的事务和用户

11、定义的事务。系统提供的事务是指在执行某些T-SQL语句时,一条语句就构成了一个事务,这些语句是:ALTER TABLE CREATE DELETE DROPFETCH GRANT INSERT OPENREVOKE SELECT UPDATE TRUNCATE TABLE 例如,执行如下的创建表语句:例如,执行如下的创建表语句: CREATE TABLE test(l1 char(6), l2 char(8), l3 varchar(20)这条语句本身就构成了一个事务,它要么建立起含三列的表结构,要么对数据库没有任何影响,绝不会建立起含一列或两列的表结构。 在实际应用中,大量使用的是用户定义的

12、事务。事务的定义方法是:用BEGIN TRANSACTION语句指定一个事务的开始,用COMMIT或ROLLBACK语句表明一个事务的结束。注意:必须明确指定事务的结束,否则系统将把从事务开始到用户关闭连接之间所有的操作都作为一个事务来处理。 11.2.2 事务处理语句事务处理语句事务处理语句包括BEGIN TRANSACTION、COMMIT、TRANSACTION和ROLLBACK TRANSACTION语句。(1)BEGIN TRANSACTION语句语句BEGIN TRANSACTION语句作为事务的开始,其语法格式为:BEGIN TRANSACTION transaction_nam

13、e|tran_name_variableWITH MARKdescription其中,transaction_name是事务的名称,必须遵循标识符规则,但字符不超过32个。tran_name_variable是用户定义的、含有效事务名称的变量,该变量类型必须是char、varchar、nchar或nvarchar。WITH MARK指定在日志中标记事务,description是描述该标记的字符串。TRANSACTION可以只取前四个字符(以下同)。(2) COMMIT TRANSACTION语句COMMIT是提交语句,它使得自从事务开始以来所执行的所有数据修改成为数据库的永久部分,也标志一个事

14、务的结束,其语法格式为:COMMIT TRANSACTION transaction_name|tran_name_variable其中,参数transaction_name和tran_name_variable分别是事务名称和事务变量名。与BEGIN TRANSACTION语句相反,COMMIT TRANSACTION的执行使全局变量TRANCOUNT的值减1。标志一个事务的结束也可以使用COMMIT WORK语句,其语法格式为:COMMIT WORK它与COMMIT TRANSACTION语句的差别在于COMMIT WORK不带参数。 (3) ROLLBACK TRANSACTION语句R

15、OLLBACK TRANSACTION语句是撤销语句,它使得事务撤销到起点或指定的保存点处,它也标志一个事务的结束,其语法格式为:ROLLBACK TRANSACTIONtransaction_name|tran_name_variable|savepoint_name|savepoint_variable其中:l 参数transaction_name和tran_name_variable分别是事务名称和事务变量名。l savepoint_ name是保存点名。l savepoint_variable是含有保存点名称的变量名,它们可用SAVE TRANSACTION语句设置。l SAVE TR

16、ANSACTION语句的语法格式为:SAVE TRANSACTION savepoint_name|savepoint_variable第十一章 SQL Server 程序设计ROLLBACK TRANSACTIONROLLBACK TRANSACTION将清除自事务的起点将清除自事务的起点或到某个保存点所做的所有数据修改,并且或到某个保存点所做的所有数据修改,并且释放释放由由事务控制的资源。如果事务撤销到开事务控制的资源。如果事务撤销到开始点,则全局变量始点,则全局变量TRANCOUNTTRANCOUNT的值减的值减1 1,而,而如果只撤销到指定保存点,则如果只撤销到指定保存点,则TRANC

17、OUNTTRANCOUNT的的值不变。值不变。也可以使用也可以使用ROLLBACK WORK语句进行事语句进行事务撤销,务撤销,ROLLBACK WORK将使事务撤销将使事务撤销到开始点,并使全局变量到开始点,并使全局变量TRANCOUNT的值减的值减1。 【例【例11.3】事务举例。事务举例。 代码如下:BEGIN TRANSACTIONINSERT INTO 教师(教师编号,姓名,性别,出生日期,学历,职务,职称,系部代码,专业)VALUES(100000000005,李明,男,08/05/65,研究生,副书记,副救授,02,经济管理)UPDATE 教师 SET 职称=教授 WHERE 教

18、师编号=100000000005SAVE TRAN ST1DELETE 教师 WHERE 姓名 IS NULLSELECT * FROM 教师SAVE TRAN ST1INSERT INTO班级(班级代码,班级名称,专业代码,系部代码)VALUES(010202003,0l级会计专业003班,0202,02)【例【例11.3】事务举例事务举例 IF ERROR0 ROLLBACK TRAN ST1ELSE COMMIT TRAN 在上例中,BEGIN TRANSACTION命令指示事务的开始,COMMIT TRAN命令指示事务的结束,SAVE TRAN命令用来生成保存点,其中的STl是保存点的

19、名称,ROLLBACK TRAN命令将恢复事务到保存点位置。在这个例子中有两个保存点,而且名称相同,ROLLBACK TRAN命令使事务恢复到第二个保存点,第一个保存点由于名称被重用,所以被忽略了。 11.2.3 分布式事务分布式事务 SQL Server 2000可支持包括多于一台服务器的事务,它是用MSDTC(Microsoft分布事务合作)服务来支持的。有3种方法可使用分布式事务:用DBLib API(应用程序接口)编写分布事务程序,它超出了本书的范围。使用TSQL语法BEGIN DISTRIBUTED TRANSACTION。可用SET REMOTE_PROC_TRANSACTION为

20、单个会话启动分布式事务。11.2.4 锁定锁定 当多个用户对数据库访问时,为了确保事务完整性和数据库一致性,需要使用锁定。如果没有锁定,SQL Server就没有防止多个用户同时更新同一数据的机制。一个锁就是在多用户环境中对某一种正在使用的资源的一个限制,它阻止其他用户访问或修改资源中的数据。SQL Server为了保证用户操作的一致性,自动对资源设置和释放锁。例如,当用户正在更新一个表时,没有任何其他用户能修改甚至查看已经更新过的记录。当所有的与该用户相关的更新操作都完成后,锁便会释放。1. 锁定粒度 在SQL Server中,可被锁定的资源从小到大分别是行、页、扩展盘区、表和据库,被锁定的

21、资源单位称为锁定粒度,上述五种资源单位其锁定粒度按由小到大排列。锁定粒度不同,系统的开销也不同,并且锁定粒度与数据库访问并发是一对矛盾,锁定粒度大,系统开销小,但并发度会降低;锁定粒度小,系统开销大,但可提高并发度。 2. 锁模式通常,SQL Server中有三类锁: 共享锁:也称为读锁,是加在正在读取的数据上的。共享锁防 止别的用户在加锁的情况下修改该数据。一旦读取数据完毕, 便立即释放资源上的共享锁,除非将事务隔离级别设置为可重 复读或更高级别,或者在事务生存周期内用锁定提示保留共享 锁。 更新锁:更新锁防止别人在改变数据的过程中修改数 据。 排他锁:当要改变数据时使用排他锁。其他事务不能

22、 读取或修改排他锁锁定的数据。 3. 死锁 死锁是指两个事务阻塞彼此进程而互相冲突的情况。第一个事务在某个数据库对象上有把锁,而另一个事务想要访问这个数据库对象。与此同时,另一个事务在这个数据库对象上也有一把锁,而第一个事务也想要访问那个数据库对象,这时就会出现死锁现象。解决的唯一办法是取消其中一个事务。 死锁避免是很重要的,因为发生死锁时,浪费了许多时间和资源。避免死锁的一种办法是要按相同顺序访问表。11.3 SQL Server变量变量 11.3.1 全局变量 11.3.2 局部变量11.3 SQL Server变量变量 变量是SQL Server用来在语句之间传递数据的方式之一。SQL

23、Server中的变量分为全局变量和局部变量,其中,全局变量的名称以“”字符开始,由系统定义和维护;局部变量的名称以“”字符开始,由用户自己定义和赋值。 11.3.1 全局变量全局变量 全局变量是系统提供且预先声明的变量。全局变量在所有存储过程中随时有效,用户利用全局变量,可以访问服务器的相关信息或者有关操作的信息。用户只能引用不能改写,且不能定义和全局变量同名的局部变量,引用时要在前面加上标记 。SQL Server 2005的所有全局变量共的所有全局变量共33个,见表个,见表11-1。 表11-1 SQL Server中的全局变量 全 局 变 量 描 述 返 回 类 型 CONNECTION

24、S 返回自上次启动SQL Server以来连接或试图连接的次数 integer CPU_BUSY 返回自上次启动SQL Server以来CPU的工作时间,单位为毫秒 integer 续表续表 全 局 变 量 描 述 返 回 类 型 CURSOR_ROWS 返回连接中最后打开的游标中当前包含的合格记录的数量 integer DATEFIRST 返回SET DATEFIRST参数的当前值,SET DATEFIRST参数指明所规定的每周的每一天:1 对应星期一,2 对应星期二,依此类推,用7对应星期日 tinyint DBTS 为当前数据库返回当前timestamp数据类型的值。这一timestam

25、p值保证在数据库中是唯一的 varbinaryERROR返回最后执行的T-SQL语句的错误代码 integer FETCH_STATUS 返回被FETCH语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态 integer IDENTITY 返回最后插入的标识值 numeric IDLE 返回SQL Server自上次启动后闲置的时间,单位为毫秒 integer IO_BUSY 返回SQL Server自上次启动后用于执行输入和输出操作的时间,单位为毫秒 integer LANGID 返回当前所使用语言的本地语言标识符(ID) smallint LANGUAGE 返回当前使用的语言名

26、 nvarchar LOCK_TIMEOUT 返回当前会话的当前锁超时设置,单位为毫秒 integer MAX_CONNECTIONS 返回SQL Server允许的同时用户连接的最大数。返回的数不必为当前配置的数值integer MAX_PRECISION 返回decimal和numeric数据类型所用的精度级别,即该服务器中当前设置的精度 tinyint NESTLEVEL 返回当前存储过程执行的嵌套层次(初始值为0) integer NESTLEVEL 返回当前存储过程执行的嵌套层次(初始值为0) integer OPTIONS 返回当前SET选项的信息 integer PACK_REC

27、EIVED 返回SQL Server自上次启动后从网络上读取的输入数据包数目 integer PACK_SENT 返回SQL Server自上次启动后写到网络上的输出数据包数目 integer PACKET_ERRORS 返回SQL Server自上次启动后,在SQL Server连接上发生的网络数据包错误数 integer PROCID 返回当前过程的存储过程标识符(ID) integer REMSERVER 当远程SQL Server数据库服务器在登录记录中出现时,返回它的名称 nvarchar(256) ROWCOUNT 返回受上一语句影响的行数。任何不返回行的语句将这一变量设置为0 i

28、nteger SERVERNAME 返回运行SQL Server的本地服务器名称 nvarchar SERVICENAME 如果当前实例为默认实例,那么 SERVICENAME返回MS SQL Server;如果当前实例为命名实例,那么该变量返回实例名称 nvarchar SPID 返回当前用户进程的服务器进程标识符 smallint TEXTSIZE 返回SET语句中TEXTSIZE选项的当前值 integer TIMETICKS 返回一刻度的微秒数 integerTOTAL_ERRORS 返回SQL Server自上次启动后,所遇到的磁盘读/写错误数 integer TOTAL_READ

29、返回SQL Server自上次启动后读取磁盘的次数 integer TOTAL_WRITE 返回SQL Server自上次启动后写入磁盘的次数 integer TRANCOUNT 返回当前连接的活动事务数 integer VERSION 返回SQL Server当前安装的日期、版本和处理器类型 nvarchar 【例【例11.4】利用全局变量查看利用全局变量查看SQL Server的版本、当前所使用的的版本、当前所使用的SQL Server服务器名称和到当前日期和时间为止试图登录的次数服务器名称和到当前日期和时间为止试图登录的次数 代码如下:PRINT 当前所用SQL Server版本信息如下

30、:PRINT VERSION -最示版本信息PRINT -换行PRINT 目前所用的SQL Server服务器名称为:+SERVERNAME -显示服务器名称PRINT GETDATE()PRINT CONNECTIONS运行结果如图11-2所示。 图图11-2 全局变量引用的结果全局变量引用的结果 11.3.2 局部变量局部变量 局部变量是用户自己定义的,只在定义它的批处理或存储过程中使用。一般用于变量计数或作为其他变量值的存储元。1. 声明局部变量 使用一个局部变量之前,必须使用DECLARE语句来声明这个局部变量,给它指定一个变量名和数据类型,对于数值量,还需要指定其精度和小数位数。DE

31、CLARE语句的浯法格式为: DECLARE 局部变量 数据类型1n第十一章 SQL Server程序设计局部变量名总是以局部变量名总是以“”符号开始,变量名最多可符号开始,变量名最多可以包含以包含128128个字符,局部变量名必须符合个字符,局部变量名必须符合SQL SQL ServerServer标识符命名规则,局部变量的数据类型可标识符命名规则,局部变量的数据类型可以是系统数据类型,也可以是用户自定义数据类以是系统数据类型,也可以是用户自定义数据类型,但不能把局部变量指定为型,但不能把局部变量指定为texttext、ntextntext或或imageimage数据类型。在一个数据类型。在

32、一个DECLAREDECLARE语句中可以定义语句中可以定义多个局部变量,但需用逗号分隔开。多个局部变量,但需用逗号分隔开。【例【例11.5】声明声明SNOSNO、SNAMESNAME、SBIRTHSBIRTH、SCORESCORE等局等局部变量。部变量。代码如下:代码如下:DECLARE SNO char(12)DECLARE SNAME char(12)DECLARE SBIRTH DATETIMEDECLARE SCROE DECIMAL(6,1) 2给局部变量赋值 所有变量声明后,均被初始化为NULL。若要对变量赋值,可以使用SELECT语句或SET语句将一个不是NULL的值赋给已声明

33、的变量。一个SELECT语句一次可以初始化多个局部变量;一个SET语句一次只能初始化一个局部变量。当用多个SET语句初始化多个变量时,为每个局部变量使用一个单独的SET语句。 (1) 用SELECT为局部变量赋初值的语法格式如下:SELECT 变量名=表达式,n如果使用一个SELECT语句对一个局部变量赋值时,这个语句返回了多个值,则这个局部变量将取得该SELECT语句所返回的最后一个值。此外,使用SELECT语句时,如果省略赋值号(=)及其后面的表达式,则可以将局部变量的值显示出来。例如:DECLARE ages int,sname char(8)SELECT ages=10SELECT s

34、name=张敏(2)用SET语句为局部变量赋初值用SET语句为局部变量赋初值的语法格式如下:SET 变量名=表达式,nSET语句的功能是将表达式的值赋给局部变量。其中,表达式是SQL Serve的任何有效的表达式。例如:DECLARE str char(20)SET str=这是一个试验。PRINT str3局部变量的作用域 局部变量的作用域指可以引用该变量的范围,局部变量的作用域从声明它的地方开始到声明它的批处理或存储过程束。也就是说,局部变量只能在声明它的批处理、存储过程或触发器中使用,一旦这些批处理或存储过程结束,局部变量将自消除。 【例【例11.6】声明一个局部变量声明一个局部变量de

35、p_name,把,把student数据库中的数据库中的“系部系部”表中系部代码为表中系部代码为01的系部名称赋给局部变量的系部名称赋给局部变量dep_name,并输出。,并输出。 代码如下:USE studentGODECLARE dep_name varchar(30) -声明局部变量SELECT dep_name=系部名称 FROM 系部 WHERE 系部代码=01PRINT 系部表中系部代码为01的系部名称为:+dep_name -输出字符串GO-该批处理结束,局部变量name自动清除PRINT 如果引用dep_name,将会出现声明局部变量的错误提示GOPRINT 系部表中系部代码为0

36、1的系部名称为:+dep_name -输出字符串GO运行结果如图运行结果如图11-3所示。所示。 图11-3 局部变量的作用域 11.4 SQL语言流程控制语言流程控制 11.4.1 BEGINEND语句块 11.4.2 IFELSE语句 11.4.3 CASE结构 11.4.4 WAITFOR语句 11.4.5 PRINT语句 11.4.6 WHILE语句11.4 SQL语言流程控制语言流程控制 流程控制语句是用来控制程序执行顺序的命令,这些命令包括条件控制语句、无条件转移语句、循环语句。使用这些语句,可以实现结构化程序设计。 11.4.1 BEGINEND语句块语句块 在条件和循环等流程控

37、制语句中,要执行两个或两个以上的T-SQL语句时就需要使用BEGINEND语句,BEGINEND语句将多个TSQL语句组合成一个语句块,并将他们作为一个整体来处理。BEGINEND语句的语法格式为:BEGlN语句组ENDBEGINEND语句块可以嵌套。【例【例11.7】使用使用BEGINBEGINENDEND语句显示语句显示“系部代码系部代码”为为“02”02”的的“班级代码班级代码”和和“班级班级名称名称”。代码如下:USE studentGOBEGIN PRINT 满足条件的班级: SELECT 班级代码,班级名称 FROM 班级 WHERE 系部代码=02ENDGO运行结果如图11-4所

38、示。 图图11-4 使用使用BEGINEND语句块示例语句块示例 11.4.2 lFELSE语句语句 在程序中,经常需要根据条件指示SQL Server执行不同的操作和运算,也就是进行程序分支控制。SQL Server利用IFELSE命令使程序有不同的条件分支,从而实现分支条件程序设计。IFELSE语句的语法格式为: IF 布尔表达式 语句1 ELSE 语句2其中布尔表达式表示一个测试条件,其取值为TRUE或FALSE。 第十一章 SQL Server程序设计 如果布尔表达式中包含一个如果布尔表达式中包含一个SELECT语句,则语句,则必须使用圆括号把这个必须使用圆括号把这个SELECT语句括

39、起来。语句括起来。语句语句1和语句和语句2可以是单个的可以是单个的T-SQL语句,也语句,也可以是用可以是用BEGINEND语句定义的语句块。语句定义的语句块。该语句的执行过程是:先求布尔表达式的值,该语句的执行过程是:先求布尔表达式的值,如果布尔表达式的值为如果布尔表达式的值为TRUE,则执行语句,则执行语句l,否则执行语句否则执行语句2。若无。若无ELSE,如果测试条件,如果测试条件成立,则执行语句成立,则执行语句1,否则执行,否则执行IF语句后面的语句后面的语句。语句。 【例【例11.8】使用使用IFELSE语句实现以下功能:如果存在语句实现以下功能:如果存在“职称职称”为为“教授教授”

40、或或 “副教授”的教师,那么输出这些教师的“姓名”、“学历”、“职务”、“职称”,否则输出没有满足条件的教师。 代码如下:USE studentGOIF EXISTS(SELECT * FROM 教师 WHERE 职称=教授 OR 职称=副教授) BEGIN PRINT 以下教师是具有高级职称的: SELECT 姓名,学历,职务,职称 FROM 教师 WHERE 职称=教授 OR 职称=副教授 ENDELSE BEGIN PRINT 没有高级职称的教师 ENDGO运行结果如图运行结果如图11-5所示。所示。 图11-5 使用IFELSE语句示例 11.4.3 CASE结构结构 如果对于一个条件

41、来说可能有不同的多种情况,那么对于不同的情况就应该执行不同的操作,在程序设计中,遇到这样的情况,使用CASE语句就比较简单。CASE具有两种格式。1简单CASE表达式CASE 条件表达式 WHEN 表达式值1 THEN 结果表达式1 WHEN 表达式值2 THEN 结果表达式2 ELSE 结果表达式nEND 其执行过程是:用条件表达式的值依次与每一个WHEN子句的表达式值比较,直到与一个表达式值完全相同时,便将该WHEN子句指定的结果表达式返回。如果没有任何一个WHEN子句的表达式值和条件表达式值相同这时,如果存在ELSE子句,便返回ELSE子句之后的结果表达式;如果不存在ELSE子句,便返回

42、一个NULL值。【例11.9】使用简单CASE结构实现以下功能:输出“课程名”,而且在“课程名”后添加“备注”。代码如下: USE studentGOSELECT 课程名,备注= CASE 课程名 WHEN 大学语文 THEN 古代文学 WHEN 高等数学 THEN 微积分 WHEN 计算机基础 THEN 计算机导论 WHEN 数据库概论 THEN 计算机网络 ENDFROM 课程课程GO运行结果如图11-6所示。图11-6 简单CASE表达式示例2搜索搜索CASE表达式表达式搜索CASE表达式语法格式为:CASE WHEN 逻辑表达式1 THEN 结果表达式1 WHEN 逻辑表达式2 THE

43、N 结果表达式2 ELSE 结果表达式nEND其执行过程是:测试每个WHEN子句后的逻辑表达式,如果结果为TRUE,则返回相应的结果表达式,否则检查是否有ELSE子句,如果存在ELSE子句,便返回ELSE子句之后的结果表达式;如果不存在ELSE子句,便返回一个NULL值。 【例【例11.10】使用搜索】使用搜索CASE表达式实现以下功能:根据表达式实现以下功能:根据“教师任课教师任课”表分别表分别输出输出“教师编号教师编号”、“课程号课程号”,并根据专业学级判别教师任课年级。,并根据专业学级判别教师任课年级。代码如下:USE studentGOSELECT DISTINCT 教师编号,课程号,

44、年级= CASE WHEN 专业学级=2001 THEN 四年级 WHEN 专业学级=2002 THEN 三年级 END FROM 教师任课G0运行结果如图11-7所示。 图11-7 搜索CASE表达式示例11.4.4 WAITFOR语句语句WAITFOR语句指定触发语句块、存储过程或事务执行的时间、时间间隔或事件。其语法格式为:WAITFOR DELAY 时间|TIME 时间其中,DELAY指定一段时间间隔过去之后执行一个操作。TIME表示从某个时刻开始执行一个操作。时间参数必须为可接受的DATETIME数据格式。在DATETIME数据中不允许有日期部分,即采用HH:MM:SS的格式。【例11.11】使用WAITFOR实现以下功能:根据“学生”表输出“系部代码”为“02”的“学号”、“姓名”、“出生日期”,在输出之前等待4秒。 代码如下:代码如下:USE studentGO WAITFOR DELAY 00:00:04 SELECT 学号,姓名,出生日期 FROM 学生 WHERE 系部代码=02GO运行结果如图11-8所示。 11.4.5 PRINT语句语句SQL Server向客户程序返回信息的方法除了使用SELECT语句外,还可以使用PRINT语句,其语法格式为:PRINT 字符串|函数|局部变量|全局变量【例11.12】PR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论