第
6章
T-SQL编程 教学目标
本章介绍了T-SQL程序设计中GO语句的使用、变量的定义、输入输出的格式以及注释的使用,介绍了流程控制语句以及游标的使用。
教学要求
知 识 要 点 能 力 要 求 掌握T-SQL程序设计中GO语句的使用、变量的定义以及注释的使用 掌握T-SQL程序设计中流程控制语句的使用 掌握T-SQL程序设计中游标的使用 相 关 知 识 GO语句、变量、注释 选择语句、循环语句、 转移语句、等待语句、返回语句 游标的基础、游标的使用 T-SQL基础 流程控制语句 游标的使用
第6章 T-SQL编程
导读
上一章介绍的插入、查询、更新和删除等SQL语句均是单条的语句,不能定义变量,没有流程控制语句,因此,无法实现复杂的业务规则控制。为解决此问题,本章介绍SQL程序设计,将学习变量的定义、赋值、流程控制和游标等内容。其中流程控制语句包括顺序、选择、循环结构的控制语句,是数据库应用程序设计的基础。
通过本章学习,读者应掌握如何用流程控制语句进行SQL设计程序,理解游标的意义,掌握游标的创建与使用。
6.1 T-SQL基础
6.1.1 GO的使用
批处理是一组SQL语句的集合,以结束符GO终结。批处理中的所有语句被一次提交SQL Server 2005,SQL Server 2005将这些语句编译为一个执行单元,称为SQL Server 2005执行计划。
批处理用GO语句作为批处理的结束标志,若没有GO语句,默认所有的语句属于一个批处理。
提示:在一个批处理中,如果出现编译错误(如某条语句存在语法错误),SQL Server 2005
将取消整个批处理内所有语句的执行。 6.1.2 T-SQL变量
变量是SQL Server 2005用来在语句之间传递数据的方式之一,是一种语言中必不可少的组成部分。
1.T-SQL变量
T-SQL变量也称为局部变量,或用户自定义变量。一般用于临时存储各种类型的数据,以便在SQL语句之间传递。例如作为循环变量控制循环次数,暂时保存函数或存储过程返回的值,也可以使用table类型代替临时表临时存放一张表的全部数据。
局部变量的作用范围是在一个批处理、一个存储过程或一个触发器内,其生命周期从定义开始到它遇到的第一个GO语句或者到存储过程、触发器的结尾结束,即局部变量只在当前的批处理、存储过程、触发器中有效。
提示:如果在批处理、存储过程、触发器中使用其他批处理、存储过程、触发器定义的变
量,则系统出现错误并提示“必须声明变量”。
用DECLARE语句声明定义局部变量 命令格式:
DECLARE {@变量名 数据类型[(长度)] } [ ,?n ]
125
SQL Server 2005 数据库原理与应用案例教程
说明:
? 局部变量必须以@开头以区别字段名变量。 ? 变量名必须符合标识符的构成规则。
? 系统固定长度的数据类型不需要指定长度,例如:INT或DATETIME。
提示:局部变量的数据类型可以是系统类型,也可以是用户自定义类型,但不允许是text、
ntext、image类型。 【例6-1】 变量的定义
DECLARE @name CHAR (8) --定义@name长度为8的字符型
DECLARE @m INT,@n DECIMAL (6,2)
--定义@m为整型,@n为小数总长度6位,其中小数2位,不计小数点
6.1.3 输入输出
1.输入
用SET、SELECT给局部变量赋值 命令格式:
说明:
? SET只能给一个变量赋值,而SELECT可以给多个变量赋值。
? 两种格式可以通用,建议首选使用SET,而不推荐使用SELECT语句。 ? SELECT也可以直接使用查询的单值结果给局部变量赋值。如: SELECT @局部变量=表达式或字段名 FROM 表名 WHERE 条件
提示:表达式中可以包含SELECT语句子查询,但只能是集合函数返回的单值,且必须用
圆括号括起来。
2.输出
用PRINT、SELECT显示局部变量的值 命令格式:
说明:
? 使用PRINT必须有且只能有一个表达式,其值在查询分析器的“消息”子窗口
显示。
? 使用SELECT实际是无数据源检索格式,可以有多个表达式,其结果是按数据表
的格式在查询分析器的“网格”子窗口显示,若不指定别名显示标题“(无名列)”。
126
PRINT 表达式
SELECT 表达式 [ ,?n ]
SET @局部变量=表达式
SELECT { @局部变量=表达式} [,?n]
【例6-2】 自定义局部变量的使用
第6章 T-SQL编程
USE Student_Course_Teacher
DECLARE @name varchar(15), @学号 char(22)
SELECT @学号='学号为s1的学生的姓名:' -- 也可使用SET SET @name= (SELECT Sn FROM s where sno='s1') PRINT @学号+ @name
GO
运行结果如图6.1所示。使用PRINT在“消息”子窗口输出表达式的值
图6.1 自定义局部变量的使用
想一想:
如果将例题中的输出显示改用SELECT语句,输出结果是什么样的? 6.1.4 注释
注释是程序的说明或暂时禁止使用的语句而不被执行,使用注释可以使程序清晰可读,有助于以后的管理维护。
SQL Server支持行注释和块注释两种方式。
1.行内注释 命令格式:
--注释内容
说明:
(1) 以两个减号开始直到本行结束的全部内容都被认为是注释内容。
(2) 行注释可以单独一行,也可以跟在SQL语句之后,注释内容中还可以有双减号(允许嵌套),双减号之后也可以没有内容。
2.块注释 命令格式:
/*注释内容*/ 说明:
(1) 以“/*”开始不论多少行,直到“*/”之间的所有文字都被作为注释内容。
(2) 块注释可以从一行开头开始,也可以跟在SQL语句之后开始,注释内容中还可以
127
SQL Server 2005 数据库原理与应用案例教程
有“/*”字符组合,也可以有单个“*”“/”字符,但不能有“*/”组合(不允许嵌套),中间可以没有注释内容。 【例6-3】 注释的使用
USE Student_Course_Teacher /*打开数据库*/
GO -- 一个批处
理结束
6.2 流程控制语句
流程控制语句是控制程序执行的命令,是指那些用来控制程序执行和流程分支的命令,流程控制语句主要用来控制SQL语句、语句块或者存储过程的执行流程。比如条件控制语句、循环语句等,可以实现程序的结构性和逻辑性,以完成比较复杂的操作。 6.2.1 语句块
BEGIN?END语句能够将多个T-SQL语句组合成一个语句块,并将它们视为一个单元处理。在条件语句和循环等控制流程语句中,当符合特定条件便要执行两个或者多个语句时,就需要使用BEGIN?END语句,将多个T-SQL语句组合成一个语句块。 6.2.2 选择
1.IF/ELSE条件语句
IF?ELSE语句是条件判断语句,其中,ELSE子句是可选的,最简单的IF语句没有ELSE子句部分。IF?ELSE语句用来判断当某一条件成立时执行某段程序,条件不成立时执行另一段程序。SQL Server允许嵌套使用IF?ELSE语句,而且嵌套层数没有限制。
命令格式:
IF 逻辑条件表达式 语句块1 [ELSE
语句块2]
说明:
(1) IF语句执行时先判断逻辑条件表达式的值(只能取TRUE或FLASE),若为真则执行语句块1,为假则执行语句块2,没有ELSE则直接执行后继语句。
(2) 语句块1、语句块2可以是单个SQL语句,如果有两个以上语句,但必须放在BEGIN?END语句块中。
【例6-4】 查询教师平均工资,如果平均工资大于3000元,则显示“收入水平较高”,否则显示“收入水平较低”。
Use Student_Course_Teacher Go
IF (SELECT AVG (sal) FROM t)>3000
128