第7章 Transact-SQL程序设计 本章导读:

Slides:



Advertisements
Similar presentations
10.2.switch语句.
Advertisements

第5章 T-SQL语言 5.1 T-SQL语言简介 5.2 常量、变量与数据类型 5.3 运算符与表达式 5.4 流程控制语句
SQL Server数据库设计基础 ——基于SQL Server 2000 陈志煌 集美大学教务处.
第5章 T-SQL语言 5.1 SQL语言与T-SQL语言 5.2 常量、变量与数据类型 5.3 运算符与表达式 5.4 流程控制语句
第5章 索引及视图操作 数据库原理应用与实践 SQL SERver2014(第2版) 主编 贾铁军 科学出版社 编著 陈国秦 万程 邢一鸣
Tool Command Language --11级ACM班 金天行.
第14章 預存程序 14-1 預存程序的基礎 14-2 建立與執行預存程序 14-3 預存程序的參數傳遞 14-4 預存程序的傳回值
Oracle数据库 Oracle 子程序.
不确定度的传递与合成 间接测量结果不确定度的评估
C语言实验 第一课 标题:学号+姓名.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
C#程序设计基础 $5 流程控制.
SQL Injection.
走进编程 程序的顺序结构(二).
辅导课程六.
SPARQL若干问题的解释 刘颖颖
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第3章 关系数据库标准语言SQL.
第十章 IDL访问数据库 10.1 数据库与数据库访问 1、数据库 数据库中数据的组织由低到高分为四级:字段、记录、表、数据库四种。
1.2 MATLAB变量表达式与数据格式 MATLAB变量与表达式 MATLAB的数据显示格式
第一章 函数 函数 — 研究对象—第一章 分析基础 极限 — 研究方法—第二章 连续 — 研究桥梁—第二章.
第二章 Java语言基础.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
第一章 函数与极限.
第4章 PHP流程控制语句.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
C语言程序设计 主讲教师:陆幼利.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
学习目标 1、什么是字符集 2、字符集四个级别 3、如何选择字符集.
顺序表的删除.
第6章 Transact-SQL程序设计 6.1 注释 6.2 变量 6.3 运算符 6.4 函数 6.5 流程控制语句.
VB与Access数据库的连接.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
Web安全基础教程
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
第六章 Excel的应用 一、Excel的单元格与区域 1、单元格:H8, D7, IV26等 2、区域:H2..D8, HS98:IT77
第4章 Excel电子表格制作软件 4.4 函数(一).
实验三 16位算术逻辑运算实验 不带进位控制的算术运算 置AR=1: 设置开关CN 1 不带进位 0 带进位运算;
第九节 赋值运算符和赋值表达式.
学习目标 1、limit的作用 2、实例操作.
3.16 枚举算法及其程序实现 ——数组的作用.
1.把下面的关系模式转化为E-R图 1)系(系号,系名,电话) 2)教师(工号,姓名,性别,年龄,系号)
College of Computer Science & Technology
第4课时 绝对值.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
ASP.NET实用教程 清华大学出版社 第4章 C#编程语言 教学目标 教学重点 教学过程 2019年5月5日.
Visual Basic程序设计 第13章 访问数据库
学习任务三 偏导数 结合一元函数的导数学习二元函数的偏导数是非常有用的. 要求了解二元函数的偏导数的定义, 掌握二元函数偏导数的计算.
学习目标 1、了解基本运算符 2、运算符优先级.
2.6 字符型数据 一、 字符常量 1、字符常量的定义 用一对单引号括起来的单个字符,称为字符常量。 例如,‘A’、‘1’、‘+’等。
GIS基本功能 数据存储 与管理 数据采集 数据处理 与编辑 空间查询 空间查询 GIS能做什么? 与分析 叠加分析 缓冲区分析 网络分析
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第二章 Java基本语法 讲师:复凡.
复习 标签(label)、文本框(text)控件 按钮:点击事件
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
基本知识 数据类型、变量、常量、运算符.
VB与Access数据库的连接.
数据表示 第 2 讲.
WEB程序设计技术 数据库操作.
鸡兔同笼(续) ——选择结构.
Java程序设计 第3章 控制语句.
复习 界面介绍 工作簿 工作表 单元格 删除 添加 改名 移动 美化 内容修改 文字设置 边框设置 背景色设置 单元格对齐 单元格合并
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
顺序结构程序设计 ——关于“字符串”和数值.
编译原理实践 6.程序设计语言PL/0.
学习目标 1、什么是列类型 2、列类型之数值类型.
Presentation transcript:

第7章 Transact-SQL程序设计 本章导读: Transact-SQL是内嵌在SQL Server中的结构化查询语言,除了具备数据查询、定义、操纵和控制功能外,还引入了程序设计的思想和过程控制结构,增加了函数、系统存储过程,触发器等。灵活运用Transact-SQL语言,可以编写基于客户/服务器模式下的数据库应用程序。 知识要点:  程序设计基础知识  流程控制语句  内置函数  用户自定义函数  事务处理 7.1 程序设计基础知识 7.2 流程控制语句 7.3 其它语句 7.4 内置函数 7.5 用户自定义函数

7.1 程序设计基础知识 程序设计的基础是处理数据,而数据在程序中最常见的形式是常量、变量和表达式。 7.1.1 常量 7.1.2 变量 7.1 程序设计基础知识 程序设计的基础是处理数据,而数据在程序中最常见的形式是常量、变量和表达式。 7.1.1 常量 7.1.2 变量 7.1.3 表达式

7.1.1 常量 常量也称字面值或标量值,是表示一个特定数据值的符号,常量的格式取决于它所表示的值的数据类型。SQL Server中常量有如下几种形式: (1)字符串常量 字符串常量分为ASCII字符串常量和Unicode字符串常量。  ASCII字符串常量 ASCII字符串常量:是指用定界符单引号(')括起来,由英文字母(a~z,A~Z)和数字(0~9)以及特殊符号(!,@)等ASCII字符组成的字符序列。如'中国','合肥'等。 如果在字符串中嵌入单引号('),可以使用两个连续的单引号('')表示嵌入的一个单引号(');而中间没有任何字符的两个连续的单引号('')表示空串。  Unicode字符串常量 Unicode字符串常量:则是以标识符(N)为前缀,再引导由定界符单引号(')括起来的字符串。如N'china',N'hefei'等。 Unicode字符串常量被解释为Unicode数据。Unicode 数据中的每个字符用两个字节存储,而ASCII字符串中的每个字符则使用一个字节存储。 注意:Unicode字符串的前缀N必须是大写字母。如:'database'是字符串常量,而N'database'是Unicode常量。

7.1.1 常量 (2)整型常量 按照整型常量的不同表示方式,又分为bit常量、interger常量和二进制常量。 二进制位常量(bit) 7.1.1 常量 (2)整型常量 按照整型常量的不同表示方式,又分为bit常量、interger常量和二进制常量。 二进制位常量(bit) 由数字 0 或 1 表示,没有定界符。如果使用一个大于1的数字,将被转换为1。 十进制常量(interger) 由正、负号和数字0~9组成,正号可以省略。例如:2006、3、-2009。 二进制常量 使用0x作为前辍,后面跟随16进制数字字符串,没有定界符。例如:0xcdE、0x12E9、0x(空二进制常量)。

7.1.1 常量 (3)日期/时间常量 日期/时间常量用定界符单引号(')括起来的特定格式的字符。SQL Server提供并识别多种格式的日期/时间,使用set dateformat mdy|dmy|ymd命令可以设置日期/时间格式。 常见的日期格式有: 字母日期格式:'April 15, 1998','15-April-1998' 数字日期格式:'10/15/2004','2004-10-15','2009年3月22日' 未分隔的日期格式:'980415','04/15/98' 常见的时间格式有:'14:30:24','04:24 PM'

7.1.1 常量 (4)decimal常量 decimal常量由正、负号、小数点、数字0~9组成,正号可以省略。例如:91.3、-2147483648.10。 (5)float和real常量 float和real常量使用科学记数法表示。例如:101.5E5、0.5E-2。 (6)货币常量 货币常量是以可选货币符号($)作为前缀,并可以带正、负号和小数点的一串数字,用来表示正的或负的货币值。SQL Server提供两种数据类型,即money和smallmoney来存储货币数据,存储的精确度为4位小数。例如$20、$45、-$35、$0.22等。 (7)uniqueidentifier常量 uniqueidentifier常量表示全局唯一标识符值的字符串。可以使用字符或二进制字符串格式指定。例如,以下这两个示例指定相同的GUID。例如: '6F9619FF-8B86-D011-B42D-00C04FC964FF'、0xff19966f868b11d0b42d00c04fc964ff

7.1.2 变量 变量是指在程序运行过程中其值可以变化的量,包括变量名和变量值两部分。变量名是对变量的命名,变量值是对变量的赋值。Transact-SQL中变量有两种:全局变量和局部变量。 1.全局变量 全局变量:是SQL Server 2000系统定义并自动赋值的变量,其作用范围是所有程序,主要用来记录SQL Server服务器的活动状态。 用户可以引用全局变量但不能改变它的值,全局变量必须以“@@”开头。SQL Server 2000提供了30多个全局变量,如表7-1所示:

7.1.2 变量 全局变量名 功能 @@connections 返回连接或企图连接到SQL Server(最近一次启动以来)的连接次数 7.1.2 变量 全局变量名 功能 @@connections 返回连接或企图连接到SQL Server(最近一次启动以来)的连接次数 @@cpu_busy 返回自SQL Server最近一次启动以来,CPU的工作时间总量,单位为毫秒 @@cursor_rows 返回当前打开的最后一个游标中还未被读取的有效数据行的行数 @@datefirst 返回一个星期中的第一天,set datefirst命令设置datafirst参数值,取值1~7 @@dbts 返回当前数据库的时间戳值,数据库中时间戳值必须是惟一的 @@error 返回最近一次执行Transact-SQL语句的错误代码号,0表示成功 @@fetch_status 返回最近一次执行fetch 语句的游标状态值 @@identity 返回最近一次插入行的identity(标识列)列值 @@idle 返回SQL Server处于空闭状态的时间总量,单位为毫秒 @@io_busy 返回SQL Server执行输入输出操作所花费的时间总量,单位为毫秒 @@langid 返回SQL Server使用的语言的ID值 @@language 返回SQL Server使用的语言名称 @@lock_timeout 返回当前会话所设置的资源锁超时时长,单位为毫秒 @@max_connections 返回允许连接到SQL Server的最大连接数目 @@max_precision 返回decimal 和numeric 数据类型的精确度 @@nestlevel 返回当前执行的存储过程的嵌套级数,初始值为0,最大值为16 @@options 返回当前set选项的信息 @@pack_received 返回SQL Server 通过网络读取的输入包的数目 @@pack_sent 返回SQL Server 写给网络的输出包的数目 @@packet_errors 返回SQL Server读取网络包的错误数目 @@procid 返回当前存储过程的ID值 @@remserver 返回远程SQL Server数据库服务器的名称 @@rowcount 返回最近一次T-SQL语句所影响的数据行的行数,0表示不返回任何行 @@servername 返回本地运行SQL Server的数据库服务器的名称

7.1.2 变量 2.局部变量 局部变量:用户自定义的变量,其作用范围是声明它的批处理、存储过程或触发器等程序内部,一般用来存储从表中查询到的数据,或作为程序执行过程中暂存变量。局部变量必须以“@”开头,且必须先用declare命令声明后才可使用。声明局部变量的语法格式如下: 格式:declare {@局部变量名 [as] 数据类型} [,…n] 说明: (1)局部变量名必须符合标识符命名规则; (2)数据类型可以是系统数据类型,也可以是用户自定义数据类型,但不能定义为text,ntext或image数据类型。如有需要,还需指定数据宽度及小数精度; (3)声明多个局部变量名时,各变量名之间用逗号隔开; (4)局部变量声明后,系统自动初始化赋值为null,局部变量声明时不能同时赋值; (5)给局部变量赋值要用赋值语句,赋值语句有两种:set语句和select语句。

7.1.2 变量  Set语句 格式:set {<@局部变量名>=<表达式>} 7.1.2 变量  Set语句 格式:set {<@局部变量名>=<表达式>} 说明:将“表达式”的值赋给“@局部变量名”指定的局部变量,一条语句只能给一个变量赋值。 【例7-1】 计算两数之和。 declare @sum int,@a as int,@b as int set @a=10 set @b=90 set @sum=@a+@b print @sum

7.1.2 变量  select语句 格式:select <{<@局部变量名>=<表达式>[,…n]} [from<表名>[,…n] where<条件表达式>] 说明: (1)将“表达式”的值赋给“@局部变量名”指定的局部变量,或者从筛选记录中计算出 “表达式”的值并赋给“@局部变量名”指定的局部变量; (2)select既可以查询数据又可以赋值变量,但不能同时使用,如果select语句返回多个数值(多行记录),则局部变量只取最后一个返回值; (3)一条语句可以给多个变量分别赋值。 【例7-2】 计算“选修”表中男生平均成绩和总成绩。 use jxgl declare @avgscore float,@sumscore float select @avgscore=avg(成绩),@sumscore=sum(成绩) from 学生,选修 where 学生.学号=选修.学号 and 性别=’男’

7.1.2 变量 2.全局变量 全局变量:是SQL Server 2000系统定义并自动赋值的变量,其作用范围是所有程序,主要用来记录SQL Server服务器的活动状态。 用户可以引用全局变量但不能改变它的值,全局变量必须以“@@”开头。SQL Server 2000提供了30多个全局变量,如表7-1所示:

7.1.3 运算符 运算符是用来连接运算对象(或操作数)的符号,表达式是指用运算符将运算对象(或操作数)连接起来式子。Transact-SQL提供7类运算符及其对应表达式,分别是算术运算符及表达式、字符串连接运算符及表达式、赋值运算符及表达式、比较运算符及表达式、逻辑运算符及表达式、位运算符及表达式、一元运算符及表达式。 1.运算符 (1)算术运算符 算术运算符用于数值型数据的算数运算,算术运算符及其适用数据类型如表7-2所示。

7.1.3 运算符 表7-2 算术运算符及其含义 算术运算符 含义 数据类型 +、-、*、/ 加,减,乘,除 7.1.3 运算符 表7-2 算术运算符及其含义 算术运算符 含义 数据类型 +、-、*、/ 加,减,乘,除 int、smallint、tinyint、decimal、float、real、money、smallmoney % 求余 int、smallint、tinyin

7.1.3 表达式 算术运算符 含义 数据类型 +、-、*、/ 加,减,乘,除 7.1.3 表达式 (2)关系运算符 关系运算符用来比较两个表达式的值是否相同,比较的结果:值相同时为true,否则为false,当参与比较操作数含有null时,结果为unknown。关系运算符及其适用数据类型如表7-3所示。 表7-3 关系运算符及其含义 算术运算符 含义 数据类型 +、-、*、/ 加,减,乘,除 int、smallint、tinyint、decimal、float、real、money、smallmoney % 求余 int、smallint、tinyin 注意:关系运算符又称为比较运算符,关系运算符不能用于text,ntext,image数据类型运算。另外。有时也把all、any、some、between…and、in、like当作关系运算符。

7.1.3 表达式 (3)位运算符 位运算符用于对数据进行按位运算。位运算符及其含义如表7-4所示。 表7-4 位运算符及其含义 7.1.3 表达式 (3)位运算符 位运算符用于对数据进行按位运算。位运算符及其含义如表7-4所示。 表7-4 位运算符及其含义 位运算符 含义 & 位与,双目运算,参与运算的两个位值都是1时,结果为1,否则为0 | 位或,双目运算,参与运算的两个位值都是0时,结果为0,否则为1 ^ 位异或,双目运算,参与运算的两个位值不同时,结果为1,否则为0 ~ 位取反,单目运算,即~1=0,~0=1 在进行整数数据的位运算时,先对整数转换为二进制数据,然后再进行按位计算;也可以对整数和二进制数据进行混合运算,但不能同时为二进制数据类型。位运算所支持的数据类型如表7-5所示。

7.1.3 表达式 (3)位运算符 位运算符用于对数据进行按位运算。位运算符及其含义如表7-4所示。 表7-5 参与位运算的左右操作数 7.1.3 表达式 (3)位运算符 位运算符用于对数据进行按位运算。位运算符及其含义如表7-4所示。 表7-5 参与位运算的左右操作数 位运算符 含义 & 位与,双目运算,参与运算的两个位值都是1时,结果为1,否则为0 | 位或,双目运算,参与运算的两个位值都是0时,结果为0,否则为1 ^ 位异或,双目运算,参与运算的两个位值不同时,结果为1,否则为0 ~ 位取反,单目运算,即~1=0,~0=1

7.1.3 表达式 (4)逻辑运算符 逻辑运算符用来将多个关系表达式连接起来进行组合运算,返回值true或false。逻辑运算符及其含义如表7-6所示。 表7-6 逻辑运算符及其含义 逻辑运算符 含义 not 非运算,单目运算,对关系表达式的值取反,即not(true)=false,not(false)=true and 与运算,双目运算,参与运算的两个关系表达式值都是true时,才为true,否则为false or 或运算,双目运算,参与运算的两个关系表达式值都是false时,才为false,否则为true

7.1.3 表达式 (5)字符串运算符 字符串运算符是用来将两个字符串连接成一个新的字符串的运算符。字符串运算符只有一个,即加号(+)。 7.1.3 表达式 (5)字符串运算符 字符串运算符是用来将两个字符串连接成一个新的字符串的运算符。字符串运算符只有一个,即加号(+)。 (6)赋值运算符 赋值运算符是将表达式的值赋给变量的运算符号。赋值运算符只有一个,即等号(=)。 (7)一元运算符 一元运算符只对一个表达式进行运算的运算符号,这个表达式的值可以是数值数据类型中的任何一种数据类型。一元运算符及其含义如表7-7所示。 表7-7 一元运算符及其含义 一元运算符 含义 + 表示数据的正号 - 表示数据的负号 ~ 求一个数字的补数

7.1.3 表达式 2.运算符的优先级 当混合使用多种运算符构成一个复杂的表达式时,表达式中有括号先算括号内,再算括号外;无括号时,运算符的优先级决定了运算的先后顺序,并影响计算的结果。运算符的优先级从高到底排列顺序如表7-8所示。 注意:表中同一行各运算符优先级相同,当表达式中含有优先级相同的多个运算符时,根据它们在表达式中的位置,二元运算符按照从左到右的顺序执行,一元运算符按照从右到左的顺序执行。

7.1.3 表达式 运算符 优先级 +(正)、-(负)、~(按位取反) 1 *(乘)、/(除)、%(模) 2 7.1.3 表达式 表7-8 运算符及其优先级 运算符 优先级 +(正)、-(负)、~(按位取反) 1 *(乘)、/(除)、%(模) 2 +(加)、(+ 串联)、−(减) 3 =、>、<、>=、<=、<>、!=、!>、!<(比较运算符) 4 ^(位异或)、&(位与)、|(位或) 5 not 6 and 7 all、any、between、in、like、or、some 8 =(赋值) 9

7.2 流程控制语句 SQL Server程序结构用来控制T-SQL语句,语句块和存储过程等的运行流程,主要包括块语句,分支语句和循环语句等。 7.2.1 块语句 7.2.2 二分支语句 7.2.3 多分支表达式

7.2.1 块语句 begin…end语句的作用是将多条T-SQL语句合成一个语句块,并将它们视为一个单元整体处理。语法格式如下: 7.2.1 块语句 begin…end语句的作用是将多条T-SQL语句合成一个语句块,并将它们视为一个单元整体处理。语法格式如下: begin {sql语句|语句块} end 说明: (1)将多条语句封装成一个语句块,服务器在处理时,整个语句块等同一条语句; (2)begin…end语句也可以嵌套。 【例7-3】 从“选修”表中求出学号为“08010101”的平均成绩,如果此平均成绩大于或等于60分,则输出“该同学全部通过考试,没有挂考”信息。 if (select avg(成绩) from 选修 where 学号='08010101')>=60 print '该同学全部通过考试,没有挂考'

7.2.2 二分支语句 if…else语句和if [not] exists…else语句是T-SQL语句提供的两种二分支结构。使用分支结构可以编写进行判断和选择操作的SQL语句(块)代码。 1.if…else语句 if…else语句用于判断条件是true或false,并且根据判断结果指定要执行的语句。通常,条件是使用比较运算符对值或变量进行比较的表达式。语法格式如下: if<条件> {sql语句1|语句块1} [else {sql语句2|语句块2}] 说明:条件表达式为true时,则运行if…else之间的“sql语句1|语句块1”,否则,如果有else分支,则运行else之后的“sql语句2|语句块2”。 【例7-4】 根据给定教师的姓名,查询出该教师的本校工龄是否在30年以上。 if (select datediff(year,工作日期,getdate()) from 教师 where 姓名='李教师')>=30 print '该教师的工龄至少30年,可以提出退休申请' else print '该教师的工龄不足30年,不可以提出退休申请'

7.2.2 二分支语句 2.if [not] exists…else语句 7.2.2 二分支语句 2.if [not] exists…else语句 if [not] exists…else语句用于检测数据是否存在,而不考虑与之匹配的行数,对于存在性检测而言,使用if [not] exists要比count(*)>0好,效率高。语法格式如下: if [not] exist<条件> {sql语句1|语句块1} [else {sql语句2|语句块2}] 说明:条件表达式为true时,则运行if…else之间的“sql语句1|语句块1”,否则,如果有else分支,则运行else之后的“sql语句2|语句块2”。 【例7-5】 根据给定课程的课程类型,如果存在就计算该种课程类型的门数。 if exists(select * from 课程 where 课程类型='考查') select count(*) as '考查课门数' from 课程 where 课程类型='考查' else print '没有考查课' 运行结果如图7-1所示。

7.2.3 多分支表达式 case表达式是计算多个条件的表达式,并返回其中一个符合条件的表达式结果。case表达式不是语句,不能独立运行,必须嵌入其它语句中才能起作用。case表达式提供两种格式:简单case表达式和搜索case表达式.

7.2.3 多分支表达式 1.简单case表达式 简单case表达式是将表达式与when子句中的值依次进行比较,直到发现第一个与表达式相等的值,便返回该when子句关联then子句中的值,不再判断后续when子句中的值。其语法格式如下: case <表达式> when <值1> then <结果1> [when <值2> then <结果2> … when <值n> then <结果n> ] [else <结果n+1>] end [as 表达式别名] 说明: (1)case函数在其开始处使用一个只计算一次的简单测试表达式。 (2)表达式的结果依次与分支中的when子句值进行比较,一旦匹配,就返回when子句关联的then子句值,然后执行end后面的子句。 (3)若所有when子句值都不满足表达式的结果,如果有else子句,则返回else子句值。

7.2.3 多分支表达式 【例7-6】 输出选修信息,并输出表中各课程号对应的课程名。 select 学号,课程号, case 课程号 7.2.3 多分支表达式 【例7-6】 输出选修信息,并输出表中各课程号对应的课程名。 select 学号,课程号, case 课程号 when '01' then '计算机基础' when '02' then 'ASP程序设计' when '03' then '数据库SQL Server' else '其它课程' end as 课程名称,成绩 from 选修

7.2.3 多分支表达式 2.搜索case表达式 case when <逻辑表达式1> then <结果值1> 7.2.3 多分支表达式 2.搜索case表达式 case when <逻辑表达式1> then <结果值1> [when <逻辑表达式2> then <结果值2> … when <逻辑表达式n> when <结果值n>] [else <结果值n+1>] end 说明: (1)依次计算when子句后的“逻辑表达式”,直到找到第一个值为true的“逻辑表达式”,就返回when子句关联的then子句中的结果值,不再判断后续when子句中的值 (2)若所有的when子句后的“逻辑表达式”都不满足true,如果有else子句,则返回else子句中的结果值。

7.2.3 多分支表达式 【例7-7】 查询学生的相关信息,并将成绩按照以下规则替换,60分以下替换不及格,60~85替换为合格,85分以上替换为优秀,其它替换为未考。 select 学生.学号,姓名,成绩= case when 成绩 is null then '未考' when 成绩 <60 then '不及格考' when 成绩 <85 then '合格' else '优秀' end from 学生,选修 where学生.学号=选修.学号

7.2.3 多分支表达式 【例7-8】 计算各教师的各门各班课程的课酬信息,课酬计算公式=学时*课酬标准,其中课酬标准分别如下:教授为50,副教授为45,讲师为35,助教为30。 select 教师.工号,课程.课程号,班级.班级号,课酬 = 学时* case when 职称='教授' then 50 when 职称='副教授' then 45 when 职称='讲师' then 35 else 30 end into 课酬 from 教师,课程,授课,班级 where 教师.工号=授课.工号 and 课程.课程号=授课.课程号 and 班级.班级号=授课.班级号 go select * from 课酬 运行结果如图7-2所示。

7.2.4 循环语句 可以使用while…continue…break语句重复执行SQL语句或语句块。语法格式如下: 7.2.4 循环语句 可以使用while…continue…break语句重复执行SQL语句或语句块。语法格式如下: while<条件> {sql语句1|语句块1} [break] {sql语句2|语句块2} [continue] 说明: (1)首先判断条件是否为true,如果为true,则按顺序往下执行循环体,本次循环执行完毕后,回到while<条件>开始处,再次判断条件,如果为true,继续执行循环体,重复前面的步骤,直至while<条件>为假,跳出循环体,结束循环; (2)break语句是使程序完全跳出本层循环,结束整个循环体的执行; (3)continue语句是使程序终止本次循环,结束循环体中continue后面语句的执行,返回while<条件>开始处,重新开始下一次的while循环。

7.2.4 循环语句 【例7-9】 求1~100之间的奇数之和。 declare @sum as int 7.2.4 循环语句 【例7-9】 求1~100之间的奇数之和。 declare @sum as int declare @i as smallint set @sum=0 set @i=0 while @i<=100 /*外层循环从1到100*/ begin set @i=@i+1 if (@i%2)=0 /*如果@i能够被2整除,则不是奇数*/ continue else set @sum=@sum+@i if @i>=99 break end print '1到100之间的奇数之和为:'+convert(char(6),@sum) /*输出和*/ 运行结果如图7-3所示。

7.2.5 其它语句 其他语句包括批处理语句,数据库切换语句,显示语句等,分别介绍如下: 1.批处理语句 7.2.5 其它语句 其他语句包括批处理语句,数据库切换语句,显示语句等,分别介绍如下: 1.批处理语句 批处理是成组执行一条或多条Transact-SQL语句的语句或命令集合。批处理运行时是一次性分析,编译和执行。 一系列顺序提交的批处理称为脚本。一个脚本中可以包含一个或多个批处理。批处理和批处理之间的定界是通过SQL Server的关键字go来定界。 在SQL Server中使用批处理有如下限制: (1)大多数create语句不可以在同一个批处理中使用,如create procedure,create rule,create default,create trigger,create view不能混合使用; (2)不能在同一批处理中使用alter table命令修改表结构后,又立即引用其新增的列; (3)不能在同一批处理中,删除一个对象后又立即重建它; (4)用set语句改变的选项在批处理结束时生效。 (5)如果在同一批处理中运行多个存储过程,则除第一个存储过程外,其余存储过程在调用时必须使用execute语句

7.2.5 其它语句 2.切换数据库语句 在代码中,使用use命令来切换数据库,其语法格式如下: 格式:use 数据库名 7.2.5 其它语句 2.切换数据库语句 在代码中,使用use命令来切换数据库,其语法格式如下: 格式:use 数据库名 说明:将指定的数据库切换为当前数据库,才可对其及其中的对象做进一步操作。 3.显示语句 Print语句用于向客户端输出信息,其语法格式如下: 格式:print ‘任何ASCII文本’|@变量|@@全局变量|字符串表达式 说明: (1)向客户端输出一个字符串,一个局部变量或全局变量; (2)如有必要,可用convert或cast函数将其它数据类型数据转换成字符串数据类型。

7.2.5 其它语句 4.暂停语句 waitfor语句是使程序暂停一段时长或暂停到某一时刻后继续执行。其语法格式如下: 7.2.5 其它语句 4.暂停语句 waitfor语句是使程序暂停一段时长或暂停到某一时刻后继续执行。其语法格式如下: 格式:waitfor {delay 'hh:mm:ss'|time 'hh:mm:ss'} 说明: (1)delay关键字表示暂停到由“hh:mm:ss”指定的时长间隔后,再继续执行其后语句,时长最大值为24小时; (2)time关键字表示暂停到由“hh:mm:ss”指定的时刻点,再继续执行其后语句。 5.注释语句 注释是用来说明程序代码的含义,提高程序的可读性,使得日后维护程序更加容易。SQL Server提供了两种形式: 格式1:--注释语句 格式2:/*注释语句*/ (1)--(双连字符)用于单行注释,从双连字符开始到结尾都是注释语句,一般放在程序后面,也可以单独另起一行; (2)/*…*/用于多行注释,位置比较自由,既可以在放在程序代码后面,也可另起一行,甚至放在程序代码内部。 (3)/*…*/不能跨越批处理,整个注释必须包含在一个批处理中。

7.2.5 其它语句 【例7-10】 查询学生选修成绩表。 use jxgl –-切换数据库jxgl为当前数据库 7.2.5 其它语句 【例7-10】 查询学生选修成绩表。 use jxgl –-切换数据库jxgl为当前数据库 select * from 选修 where left(学号,6)=’080101’ /*筛选条件*/ order by 籍贯 asc /*升序输出,默认值为ASC*/

7.2.5 其它语句 6.无条件退出语句 return语句可以出现在T-SQL语句的批处理,语句块和存储过程中的任何位置,其作用无条件地从存储过程、批处理或语句块中退出,其后的语句不会被执行。语法格式如下: 格式:return[<整数值>] 说明: (1)结束当前程序的运行,返回到调用它的上一级程序; (2)整数值是被调用的存储过程向父进程报告本进程的执行状态; (3)如果没有指定返回值,SQL Server系统会根据程序执行的结果返回一个内定值(−99~−1),常见内定值及其含义如表7-9所示。

7.2.5 其它语句 表7-9 内定值及其含义 返回值 含义 程序执行成功 -7 资源错误 -1 找不到对象 -8 非致命错误 -2 7.2.5 其它语句 表7-9 内定值及其含义 返回值 含义 程序执行成功 -7 资源错误 -1 找不到对象 -8 非致命错误 -2 数据类型错误 -9 已达到系统的极限 -3 死锁 -10,-11 致命的内部不一致错误 -4 违反权限原则 -12 表或指针错误 -5 语法错误 -13 数据库破环 -6 用户造成的一般错误 -14 硬件错误

7.2.5 其它语句 7.无条件跳转语句 goto语句改变程序的执行流程,使程序流程被无条件地转移到有标号的语句处继续执行,而位于goto语句和标号之间的语句不会被执行。语法格式如下: 格式:goto标号 … 标号: 说明: (1)goto语句和标号可以用在语句块、批处理中和存储过程中,标号可以是数字和字符的组合,但必须以冒号(:)结尾; (2)goto语句破坏了程序结构化的特点,使得程序结构变得复杂而难以理解,建议不用; (3)goto语句实现的逻辑结构完全可以使用其它语句实现,goto语句最好用于跳出深层次嵌套的控制流语句。

7.2.5 其它语句 【例7-11】 查询选修表,如果其中存在学号为’08010101’的学生,那么就显示“该学生的成绩存在”,并查询出该学生所有课程的成绩,否则跳转过这些语句,显示“没有此学生的成绩”。 if (select count(*) from 选修 where 学号='08010101')=0 goto noation begin print '该学生的成绩存在' select 学号,课程号,成绩 from 选修 where 学号='08010101' end noation: print '该学生的成绩不存在'

7.2.5 其它语句 8.返回错误代码语句 将报错信息显示在屏幕上,同时记录在NT日志中,其语法格式如下: 7.2.5 其它语句 8.返回错误代码语句 将报错信息显示在屏幕上,同时记录在NT日志中,其语法格式如下: 格式:raiserror ({msg_id|msg_str}{,serverity,state}[,argument[,…n]])[with option[,…n]] 说明: (1)msg_id是存储于sysmessages表中的用户定义的错误信息标识号。户定义的错误信息标识号应大于50000。由特殊消息产生的错误号是第50000号; (2)msg_str是一条特殊的消息,此消息最多包含4000个字符; (3)serverity表示用户定义的与消息关联的严重级别,用户可以从0~18之间的严重级别,19~25之间的严重级别只能由系统管理员引发。严重等级在25以上的错误在使用raiserror引发时,必须选择with log选项; (4)state从1~127的任意整数,表示有关错误发生的状态信息; (5)with option给出raiserror的选项,option取值如表7-10所示。

7.2.5 其它语句 值 含义 log 错误记录到SQL Server错误日志中和windows NT应用程序日志中 nowait 7.2.5 其它语句 表7-10 option取值及其含义 值 含义 log 错误记录到SQL Server错误日志中和windows NT应用程序日志中 nowait 将错误消息发送到客户端 seterror 始终将全局变量@@error中的值置为用户自定义的报错消息的错误代码或50000

7.2.5 其它语句 【例7-12】 在屏幕上显示一条信息,在信息中列出当前使用的数据库标识号和名称,信息由格式化字符串直接给出。 use jxgl go declare @dbid int set @dbid =db_id() declare @dbname nvarchar(128) set @dbname=db_name() raiserror('当前数据库的id值为:%d,数据库名为:%s.',16,1,@dbid,@dbname) 运行如果如图7-4所示。 图7-4 例7-12运行结果

7.3 内置函数 函数是由一条或多条Transact-SQL语句组成的集合,用于完成某个特定的功能。SQL Server提供了两种类型的函数:内置函数和用户自定义函数,用户可以直接调用这些函数。 内置函数是系统预定义的函数,是Transact-SQL语言的一部分,一般分为三大类: (1)行集函数:返回的结果是对象,该对象可在Transact-SQL语句中用作表来引用。 例如,使用openquery函数执行一个分布式查询,以便从服务器shuju中提取表“student”中的记录。 select * from openquery(shuju,'select name, id from student') (2)聚合函数:对一组值进行处理和计算,并返回一个单列值。 例如,设在当前数据库中拥有一个员工工资表“employee”,其中有一个工资列“salary”,统计所有员工的工资总和,语句为: select sum(salary) from employee (3)标量函数:对传递给它的一个或者多个值进行处理和计算,并返回一个单列值。

7.3.1 数学函数 常见的数学函数如表7-11所示。 函数名 功能 abs(x) 求绝对值 log10(x) 求以10为底的自然对数 7.3.1 数学函数 常见的数学函数如表7-11所示。 函数名 功能 abs(x) 求绝对值 log10(x) 求以10为底的自然对数 sqrt(x) 求平方根 round(x,n) n<0,对整数部分四舍五入,n>0为保留小数位 square(x) 求平方 ceiling(x) 求大于等于给定数的最小整数 power(x,y) 求x的y次方 floor(x) 求小于等于给定数的最大整数 sin(x) 求正弦值 pi() 返回圆周率 cos(x) 求余弦值 radians(x) 将角度值转换为弧度值 tan(x) 求正切值 degrees(x) 将弧度值转换为角度值 log(x) 求自然对数 sign(x) 求一个数的符号 exp(x) 求指数值 rand(x) 随机数

7.3.2 聚合函数 常用的系统函数如表7-12所示。 聚合函数 功能 avg([distinct|all]表达式) 7.3.2 聚合函数 常用的系统函数如表7-12所示。 聚合函数 功能 avg([distinct|all]表达式) 返回表达式(含列名)的平均值,distinct是去掉重复值,all是所有值 count([distinct|all]表达式) 对表达式指定的列值进行计数,忽略空值,distinct|all含义同上 count([distinct|all] *) 对表或组中的所有行进行计数,包含空值,distinct|all含义同上 max([distinct|all]表达式) 表达式中最大的值,distinct|all含义同上 min([distinct|all]表达式) 表达式中最小的值,distinct|all含义同上 sum([distinct|all]表达式) 表达式值的合计,distinct|all含义同上

7.3.2 聚合函数 【例7-13】 查询学生表中学生总数 select count(*) from 选修 7.3.2 聚合函数 【例7-13】 查询学生表中学生总数 select count(*) from 选修 【例7-14】 统计参加选修课程的学生数。 select count(distinct 学号) from 选修 【例7-15】 统计学生表中各班级现有男生学生数。 select '班号'=left(学号,6),count(*) as 人数 from 学生 where 性别='男' group by left(学号,6) 注意:只有group by 子句中列才能与聚集函数同时出现在select子句中。 【例7-16】 统计选修表中各门课程的最高分、最低分、平均分。 select 课程号,max(成绩),min(成绩),avg(成绩) from 选修 group by 课程号

7.3.3 系统函数 常用的系统函数如表7-13所示。 函数名 功能 host_id() 客户进程的当前住进程的ID号 7.3.3 系统函数 常用的系统函数如表7-13所示。 函数名 功能 host_id() 客户进程的当前住进程的ID号 host_name() 返回服务器端的计算机的名称 suser_sid() 返回SQL Server sa登录名的安全标识号 db_id() 返回指定数据的标志id db_name() 根据数据库的标志ID返回相应的数据库的名字 datbaseproperty(数据库,属性名) 返回指定数据库在指定属性上的取值 object_id(对象名) 返回指定数据库对象的表示ID object _name(对象Id) 根据数据库的标志ID返回相应的数据库对象名字 object eproperty((对象Id,属性名) 返回指定数据库对象在指定属性上的取值值 col_length(数据库表名,列名) 返回指定表的指定列的长度 col_name(数据库表Id,列序号) 返回指定表的指定列的名字

7.3.4 字符串函数 常见的字符串函数如表7-14所示。 函数名 功能 upper(str) 将字符串转化大写 lower(str) 7.3.4 字符串函数 常见的字符串函数如表7-14所示。 函数名 功能 upper(str) 将字符串转化大写 lower(str) 将字符串转化小写 ltrim(str) 删除字符串左边的空格 rtrim(str) 删除字符串右边的空格 char(n) 求ASCII码值对应的字符 replicate(str,n) 字符串连续输出n次 left(str,n) 从左边获取n个字符串 right(str,n) 从右边获取n个字符串 space(n) 输出n个空格 nchar(n) 返回unicode字符 reverse(str) 反转输出字符串 datalength(str) 返回所占字符串的字节数 ascii(str) 求字符串中第一个字符的ASCII码值 charindex(str1,str2[,n]) 从字符串str1中指定位置n处查找字符串str2 replace(str1,str2,str3) 用字符串str3替换字符串str1中出现的字符串str2 stuff(str1,n,m,str2) 将str1从位置n到m的字符串替换为str2 str(value,n[,m]) 数字转换成长度为n的字符串,同时含m位小数 patindex(‘%subs%’,str) 查找字符串str中指定格式的字符串subs len(str) 求字符串的字符个数,不包括尾部空格 substring(str,n,m) 从字符串中指定位置n处开始取m个字符

7.3.4 字符串函数 【7-17】 在“教师”表中查找姓名以“李”开头的教师。 7.3.4 字符串函数 【7-17】 在“教师”表中查找姓名以“李”开头的教师。 select patindex('%李_%',姓名) from 教师

7.3.5 日期和时间函数 函数名 功能 getdate() 返回当前系统日期和时间 dateadd(间隔因子,n,d) 7.3.5 日期和时间函数 用于对日期和时间数据进行各种不同的处理或运算,并返回一个字符串、数字值或日期和时间值,常见的字符串表达式如表7-15所示。 表7-15 日期和时间函数及其功能 函数名 功能 getdate() 返回当前系统日期和时间 dateadd(间隔因子,n,d) 计算日期时间加d加上数字n后日期时间,间隔因子如表7-16所示 datediff (间隔因子,d1,d2) 计算d1-d2时间间隔,间隔因子如表7-16所示 datename(间隔因子,d) 返回日期时间d的的名称,如datename(month,’1980-3-4’)=03 day(d) 返回日的值 month(d) 返回月的值 year(d) 返回年的值

7.4.5 日期和时间函数 时间间隔因子可以使用年月日等表示日期时间的英文全称,也可以使用缩略字母,缩略为字母形式如表7-16所示。 7.4.5 日期和时间函数 时间间隔因子可以使用年月日等表示日期时间的英文全称,也可以使用缩略字母,缩略为字母形式如表7-16所示。 表7-16 间隔因子及其功能 全称 year month day quarter dayofyear weekday week hour minute second milliminute 简称 yyyy|yy m|mm dd|d qq|q dy|y wk|ww dw hh mi|n ss|s ms 说明 年 月 月内日数 季度 年内日数 年内周数 星期几 小时 分钟 秒 毫秒

7.4.6 转换函数 一般情况下,SQL Server会自动完成各数据类型之间的转换,有时,自动转换的结果不符合预期结果,这时可考虑利用转换函数进行转换。SQL Server 2000提供了两个转换函数:cast()函数和convert()函数。 1.cast函数 用于将某种数据类型的表达式显式转换为另一种数据类型的数据。 格式:cast(表达式 as 数据类型)

7.4.6 转换函数 2.convert函数 也用于将某种数据类型的表达式显式转换为另一种数据类型的数据,convert()函数的优点是可以格式化日期和数值型数据,在将日期时间类型的数据转换为字符类型的数据时,还可以指定转换后的字符样式。 格式:convert(数据类型[(长度)],表达式[,格式码]) 说明: (1)第1个是目标数据类型; (2)第2个是源数据; (3)第3个是可选参数,用于输出字符串格式,适用于日期时间型数据或数值型数据、货币型数据转换为字符型数据,如果格式码为NULL,则返回的结果也为NULL; (4)预定义的符合国际和特殊要求的日期时间输出格式码有30种,如表7-17所示。

7.4.6 转换函数 表7-17 convert()函数格式码说明及示例 格式码 年份位数 小时格式 说明 示例 2 12 默认 7.4.6 转换函数 表7-17 convert()函数格式码说明及示例 格式码 年份位数 小时格式 说明 示例 2 12 默认 Apr 25 2005 1:05PM 1 美国 04/24/05 ANSI 05.04.25 3 英国/法国 25/04/05 4 德国 25.04.05 5 意大利 25-04-05 6 定制-仅日期 25 Apr 05 7 Apr 25,05 8 24 定制-仅时间 13:05:35 9 默认,毫秒 Apr 25 2005 1:05:35:123 PM

7.4.6 转换函数 表7-17 convert()函数格式码说明及示例 10 2 美国 04-25-05 11 日本 05/04/25 7.4.6 转换函数 表7-17 convert()函数格式码说明及示例 10 2 美国 04-25-05 11 日本 05/04/25 12 ISO 050425 13 4 24 欧洲 25 Apr 2005 13:05:35:123 14 定制时间,毫秒 13:05:35:123 100 默认 Apr 25 20051:05PM 101 04/24/05 102 ANSI 2005.04.25 103 英国/法国 25/04/2005 104 德国 25.04.2005

7.4.6 转换函数 表7-17 convert()函数格式码说明及示例 105 4 意大利 25-04-05 106 定制-仅日期 7.4.6 转换函数 表7-17 convert()函数格式码说明及示例 105 4 意大利 25-04-05 106 定制-仅日期 25Apr2005 107 Apr25,2005 108 24 定制-仅时间 13:05:35 109 12 默认,毫秒 Apr 252005 1:05:35:123PM 110 美国 04-25-2005 111 日本 2005/04/25 112 ISO 20050425 113 欧洲 25 Apr 2005 13:05:35:123 114 定制时间,毫秒 13:05:35:123

7.4.6 转换函数 注意:格式代码0,1和2也可用于数值类型,它们对小数与千位分隔符格式产生影响。而不同的数据类型所受的影响是不一样的。一般来说,使用格式代码0(或者不指定这个参数的值),将返回该数据类型最惯用的格式。使用1或者2通常显示更为详细或者更精确的值。

7.4.6 转换函数 【例7-18】 用convert()转换money数据类型数据,查看格式码分别0,1,2的结果。 7.4.6 转换函数 【例7-18】 用convert()转换money数据类型数据,查看格式码分别0,1,2的结果。 declare @num money set @num = 1234.56 select convert(varchar(50), @num, 0) select convert(varchar(50), @num, 1) select convert(varchar(50), @num, 2) 返回分别结果如下:1234.56、1,234.56、1234.5600 【例7-19】 用convert()转换float数据类型数据,查看格式码分别0,1,2的结果。 declare @num2 float set @num2 = 1234.56 select convert(varchar(50), @num2, 0) select convert(varchar(50), @num2, 1) select convert(varchar(50), @num2, 2) 返回分别结果如下:1234.56、1.2345600e+003、1.234560000000000e+003

7.4 用户自定义函数 用户自定义函数的名称和源码分别存储在系统表sysobjects和syscomments中,通过系统存储过程sp_help、sp_helptext可以查看用户自定义函数的概要信息和源码信息。用户自定义函数一经定义,就可以像调用内置函数一样来调用。用户自定义函数有3种类型: (1)返回单值的标量函数; (2)类似于视图的可更新内嵌表值函数; (3)使用代码创建结果集的多语句表值函数。

7.4.1 标量函数 标量函数是返回单个值的函数。标量函数可以接受0到多个参数进行计算,并返回单个值。标量函数类似于内置函数,可以在SQL Server的表达式中使用该函数。语法格式如下: create function <拥有者.函数名> ( [ { @形式参数名 [as] 数据类型 [ = 默认值 ] } [ ,...n ] ] ) returns 返回值数据类型 [ with <encryption|schemabinding> [ [,] ...n] ] [ as ] begin 函数语句体 return 返回值表达式 end 说明: (1)拥有者.函数名:函数命名符合标识符命名规则; (2)@形式参数名:定义形式参数(形参)时可以指定默认值,形参数据类型不可以是text,ntext,image,cursor,table和timestamp; (3)returns 返回值数据类型:指定返回值的数据类型; (4)with encryption:是指对函数语句进行加密,所定义的文本以加密的形式存储在系统表syscomments中; (5)with schemabinding:指定将函数绑定到它引用的数据库对象,且不能修改(alter)和删除(drop)。 (6)标量函数的函数体语句定义在begin...end语句,其中return 语句是必不可少的,用于返回函数值; (7)可以使用select语句或execute语句调用函数,调用函数时,如不为指定默认值的形参提供实参值(或指定关键字default),则表示直接引用默认值。

7.4.1 标量函数 【例7-20】 创建一个用户自定义标量函数fsum,求两个数的和。 7.4.1 标量函数 【例7-20】 创建一个用户自定义标量函数fsum,求两个数的和。 Create function dbo.fsum (@num1 int,@num2 int=6) Returns int As Begin Return @num1+@num2 End Go declare @j int exec @j=dbo.fsum 2,8 print @j exec @j=dbo.fsum @num1=90,@num2=10 go

7.4.1 标量函数 【例7-21】 在jxgl数据库中创建一个用户自定义标量函数fage,然后学生表查询出学生的姓名,姓名,性别和年龄;从教师表中查询出教师的工号,姓名,姓名,性别和工龄。 create function dbo.fage(@priordate datetime,@curdate datetime) returns int as begin return year(@curdate)-year(@priordate) end go select 学号,姓名,性别,dbo.fage(出生日期,getdate()) as 年龄 from 学生 select 工号,姓名,性别,dbo.fage(工作日期,getdate()) as 年龄 from 教师

7.4.2 内嵌表值函数 内嵌表值函数和视图相似,都包含一条select语句,其查询结果构成了内嵌表值函数的返回值——记录集(表)。内嵌表值函数可以使用参数,也可以不使用参数。语法格式如下: create function <[拥有者.]函数名> ( [ { @形式参数名 [as] 数据类型 [ = 默认值 ] } [ ,...n ] ] ) returns table [ with <encryption|schemabinding> [ [,] ...n] ] [ as ] return (select 语句) 说明: (1)拥有者.函数名:函数名命名符合标识符命名规则; (2)@形式参数名:定义形式参数时可以指定默认值,但调用时必须提供具体实参值或指定关键字default引用默认值; (3)returns table:内嵌表值函数的返回值是一个表; (4)内嵌表值函数的函数体不使用begin…end语句,而是通过return语句返回select语句查询得到的结果集,其功能相当于一个参数化的视图,即可以当成一个虚表来使用; (5)内嵌表值函数只能通过select语句调用。

7.4.2 内嵌表值函数 【例7-22】 创建一个根据学号返回学生学号,姓名,性别,课程号,成绩等信息的函数。 7.4.2 内嵌表值函数 【例7-22】 创建一个根据学号返回学生学号,姓名,性别,课程号,成绩等信息的函数。 create function dbo.finfo(@xh char(8)='08010101') returns table as return ( select 学生.学号,姓名,性别,课程号,成绩 from 学生,选修 where 学生.学号=选修.学号 and 学生.学号=@xh) go select * from dbo.finfo(default) 运行结果如图7-5所示。

7.4.3 多语句表值函数 多语句表值函数可以看作标量函数和内嵌表值函数的联合,它集中了这两个函数的优点。和内嵌表值函数一样,多语句表值函数的返回值也是记录集(表)。区别在于:一是多语句函数主体中的 returns 子句指定的 table 短语带有列名及其数据类型;二是函数返回值是由带子查询(select语句)的insert语句填充。语法格式如下: create function <[拥有者.]函数名> ( [ { @形式参数名 [as] 数据类型 [ = 默认值 ] } [ ,...n ] ] ) returns <@表名> table (字段名 数据类型 [,…n]) [ with <encryption|schemabinding> [ [,] ...n] ] [ as ] begin insert [into] @表名 select语句 return end 说明:(1)拥有者.函数名:函数名命名符合标识符命名规则; (2)@形式参数名:定义形式参数时可以指定默认值,但调用时还必须指定值或者指定关键字default; (3)@表名:是table类型的局部变量名,其作用域位于函数内,存储函数返回的行值; (4)Insert [into] @表名 select 语句:向@表名指定的表变量中填充select 语句查询到的数据; (5)函数的返回值也是一个表,但函数体必须在begin…end语句块中定义;

7.5.3 多语句表值函数 【例7-23】 创建一个根据课程号查询返回选修该课程的学生学号,姓名,性别,课程号,成绩等信息的函数。 7.5.3 多语句表值函数 【例7-23】 创建一个根据课程号查询返回选修该课程的学生学号,姓名,性别,课程号,成绩等信息的函数。 create function score_info(@courseid char(2)) returns @total_score table( 课程号 char(2),学号 char(8),姓名 char(6),性别 char(2),成绩 tinyint) as begin insert @total_score select 课程号,选修.学号,姓名,性别,成绩 from 选修,学生 where 选修.学号=学生.学号 and 课程号=@courseid return end go select * from score_info('02')

7.4.4 修改函数 修改函数使用alter function语句,修改函数实质是改变现有函数中存储的源代码,因而其格式与创建函数相同。

7.4.5 删除函数 删除函数的语法格式:drop function <[拥有者.]函数名>