资源描述
第6章 Transact-SQL编程基础
课题:Transact-SQL编程基础(一)
目的要求:
掌握T-SQL语言常量的用法
掌握T-SQL语言变量的用法
掌握T-SQL语言自变量的定义与用法
掌握T-SQL语言运算符与表达式的用法
重点难点:
T-SQL语句变量的用法
课外作业布置:
复习本节课内容,完成本章习题
6.1 常 量
复习与提问
1.指出select语句中下面选项的含义:
on , order by, group by, having, join
2.利用表student_info和result_info,将200501班的全体同学的每门课程成绩加20,写出SQL语句。
3.说明内连接与外连接的区别。
4.子查询语句有什么特点?
5.创建表course_info的副本couse_table,请写出SQL命令。
6.1.1 SQL标识符
SQL标识符是由用户定义的SQL Server可识别的有特定意义的字符序列。用户定义SQL标识符时必须遵循以下规则。
标识符的长度为1~128个字符。
可以使用的字符包括字母、汉字、数字、#、$、@和下划线“_”。
标识符不能包含空格,也不能使用SQL的关键字,一般以英文字母或者汉字开头。
标识符表示数据库名、表名、视图名、用户名、字段名、函数名、变量名、用户自定义类型名等。
6.1.2 常量
常量指在程序运行过程中值不变的量。根据常
量值的不同类型,分为以下几种:
1.字符串常量
字符串常量分为ASCII常量(单字节表示一个字符)和Unicode常量(双字节表示一个字符)。
2.整型常量
按照整型常量的不同表示形式,可以分为二进制型(具有前辍 0x 并且是十六进制数字字符串,如0x12EF )、十进制型和十六进制型。
3.实型常量
实型常量有定点表示和浮点表示两种方式。
4.日期时间型常量
日期时间型常量要用英文单引号(’ ’)括起来。
5.货币型常量
货币型常量实际上是以“$”作为前缀的整型或实
型数据,如$27,$3.45。
6.uniqueidentifier常量
uniqueidentifier常量可以使用字符或十六进制
字符串指定,如0x345ffa8ce232。
6.2 变 量
变量指的是在程序运行过程中值可以发生变化的量,可以用它保存在程序运行过程中的计算结果或者是输入输出结果。定义和使用变量时要注意以下几点:
① 遵循“先定义再使用”的原则;
② 定义一个变量包括用合法的标识符作为变量名和指定变量的数据类型;
③ 给变量取名时能代表变量用途的标识符。
分类:全局变量、局部变量。
6.2.1 全局变量
在SQL Server中,全局变量以@@作为前缀,任何程序可以随时调用。通常被SQL服务器用来跟踪服务器范围和特定会话期间的信息,所以不能被显式地赋值和声明,由系统定义。
1.@@rowcount
记录前一条SQL Server语句处理的记录的行数。比如执行了一个SELECT语句后会得到许多记录,那么这个记录的行数就由@@rowcount保存。
【例6-1】检查查询语句执行后变量@@rowcount的值是否为0,不为0,显示信息“存在相应记录!”。
SELECT student_Name ,tele_Number
FROM student_Info
WHERE student_Sex='男'
IF @@rowcount<>0
PRINT '存在相应记录! '
Else print ‘不存在相应记录! '
2.@@error
每条Transact-SQL语句执行后,服务器会赋值给这个变量一个整型值:0,表示Transact-SQL语句执行过程没有错误,否则就表示语句执行失败。
6.2.2 局部变量
局部变量一般用在批处理、存储过程和触发器中,其作用范围仅局限于程序内部,不得与全局变量同名。局部变量必须先声明后引用,被引用时要加上标志@。
1.局部变量的声明
语法:
DECLARE @变量名 数据类型[,…]
参数说明:
① DECLARE关键字用于声明局部变量。
② 局部变量名前面必须加上字符“@”用于表明该变量名是局部变量。
③ 同时声明几个变量时彼此间需要用“,”分隔。
2.局部变量的赋值
局部变量被声明后,通过SET来赋值。
语法:
SET @变量名=表达式
参数说明:
① 局部变量没有赋值时其值是NULL。
② 不能在一个SET语句中同时对几个变量赋值,如果要想借助SET给几个变量赋值,那么就分别声明。
【例6-2】按要求编写程序。先定义了一个INT
类型@NUM变量,CHAR类型@CNUM变量,
然后分别赋值2004,最后使用PRINT语句将这
两个变量的值输出。
DECLARE @NUM INT,@CNUM CHAR(10)
SET @NUM=2004
SET @CNUM='2004'
PRINT @NUM
PRINT @CNUM
局部变量可以通过select输出,也可以通过查询给变量赋值,还可以在语句中使用set给局部变量赋值。
例2:局部变量可以通过select输出
declare @sentence char(20)
select @sentence=‘This is SQL Server2005’
select @sentence
go
局部变量可以通过select输出,也可以通过查询给变量赋值,还可以在语句中使用set给局部变量赋值。
例3:通过查询给局部变量可以赋值
use student
go
declare @rows int
set @rows=(select count(*) from student_info)
print @rows
局部变量可以通过select输出,也可以通过查询给变量赋值,还可以在语句中使用set给局部变量赋值。
例4:在select语句中使用由set赋值的局部变量,输出家住武汉的学生的姓名和电话号码。
1. use student
2. go
3. declare @city char(10)
4. set @city='武汉'
5. select student_name+‘ ’+tele_number as 基本情况,@city as 城市
6. from student_info
7. where substring(address,1,2)=@city
6.3 用户自定义数据类型
用户可以自己定义数据类型,但实际上也是建立在SQL Server系统所提供的标准数据类型基础之上的。用户自定义数据类型只有在它们被定义的数据库中才是可用的。如果想要在用户所定义的数据库中都可以使用,那么就要把它定义到model数据库中。
用户数据类型一旦定义好了,可以像标准数据类型一样使用,作为表中列的类型。
1.利用系统存储过程定义和删除用户自定义数据类型。
语法:
① 定义用户自定义数据类型
sp_addtype [@typename=] 类型名,
[@phystype=] ‘标准数据类型(宽度)’,
[,[@nulltype=] 是否允许为空],
[,[@owner=]所有者名字]
②参数说明
① sp_addtype是创建用户自定义数据类型的系统存
储过程,所带参数的含义如下:
1)字符串@typename=称为占位符,可写可不写。
2)新的数据类型名,在数据库必须是惟一的。
3)系统数据类型,必须用单引号括起来,不能是timestamp。
4)是否允许为空:新的数据类型处理空值的方式,可以取‘NULL‘、'NOT NULL'或'NONULL' 。默认值是'NULL'。
5)所有者名字:新的数据类型的所有者,默认当前用户。
2、删除用户自定义数据类型
sp_droptype [@typename=] 类型名
说明:
类型名必须用单引号括起来。
如果某个列使用了用户自定义数据类型,那么不允许用sp_droptype删除这个类型。
【例6-5】利用sp_addtype定义一个新的数据类型phone。
Exec sp_addtype phone,'char(10)'
【例6-6】利用sp_addtype定义一个新的数据类型
birthday。
Exec sp_addtype birthday, datetime, 'NULL'
所定义的数据类型名称是birthday,基于datetime。
2.利用企业管理器定义和删除用户自定义数据类型
3.使用用户自定义数据类型的使用:用户自定义数据类型创建好后,可以像系统数据类型一样使用。
CREATE TABLE student_Info
( student_ID INT not null PRIMARY KEY,
student_Name CHAR(10) NULL,
student_Sex CHAR(2) NOT NULL,
born_Date birthday,
class_NO INT,
tele_Number phone,
ru_Date DATETIME,
address VARCHAR(50),
comment VARCHAR(200))
6.4 运算符与表达式
1.算术运算符
算术运算符用于数值型字段和变量之间的算术运算,包括
+、−、*、/、%(取模)。
2.位运算符
位运算符包括&(与)、|(或)、^(异或)、~(求反)运
算符,并按照表6-1所示的运算规则对数据进行按位运算。
注意求反运算符是一元操作符。
【例6-7】打印1与1按位求异或运算的结果。
DECLARE @a bit
SET @a=1^1
PRINT @a
3.比较运算符
结果返回一个布尔值。系统提供的比较运算符包括:=(等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、!=(不等于)、<>(不等于)、!<(不小于)、!>(不大于)。
4.逻辑运算符
逻辑运算符一般构成复杂的逻辑表达式,包括and or not 三种,其结果是一个逻辑值。
5.字符串连接运算符
通过字符串连接运算符“+”可以实现多个字符串的连接。
【例6-8】查看2005年入学的学生姓名和学号,要求两者要作为一列结果输出。
1. Use Student
2. SELECT (student_ID +SPACE(1)+'--'+SPACE(1)+student_Name ) AS 学号及姓名
3. FROM student_Info
4. WHERE LEFT(student_ID,4)='2005'
第20教案 实训10:T-SQL语句用法(一)
实训10:T-SQL语句用法(一)
(一)、实训目的
通过实训掌握T-SQL语句使用变量的方法
通过实训掌握T-SQL语句使用变量常量的方法
通过实训掌握T-SQL语句使用自定义变量的方法
通过实训掌握T-SQL语句使用函数与表达式的方法
(二)、实训内容
1、变量的用法
例1:检查查询语句执行后变量@@rowcount的值是否为0,不为0,显示信息“存在相应记录!”。
SELECT student_Name ,tele_Number
FROM student_Info
WHERE student_Sex='男'
IF @@rowcount<>0
PRINT '存在相应记录! '
Else print ‘不存在相应记录! '
例2:按要求编写程序。先定义了一个INT
类型@NUM变量,CHAR类型@CNUM变量,
然后分别赋值2004,最后使用PRINT语句将这
两个变量的值输出。
DECLARE @NUM INT,@CNUM CHAR(10)
SET @NUM=2004
SET @CNUM='2004'
PRINT @NUM
PRINT @CNUM
例3:在select语句中使用由set赋值的局部变量,输出家住武汉的学生的姓名和电话号码。
8. use student
9. go
10. declare @city char(10)
11. set @city='武汉'
12. select student_name+‘ ’+tele_number as 基本情况,@city as 城市
13. from student_info
where substring(address,1,2)=@city
2. 自己定义数据类型
例4:利用sp_addtype定义一个新的数据类型
birthday。
Exec sp_addtype birthday, datetime, 'NULL'
CREATE TABLE student_Info
( student_ID INT not null PRIMARY KEY,
student_Name CHAR(10) NULL,
student_Sex CHAR(2) NOT NULL,
born_Date birthday,
class_NO INT,
tele_Number phone,
ru_Date DATETIME,
address VARCHAR(50),
comment VARCHAR(200))
3. 运算符与表达式
例5:查看2005年入学的学生姓名和学号,要求两者要作为一列结果输出。
5. Use Student
6. SELECT (student_ID +SPACE(1)+'--'+SPACE(1)+student_Name ) AS 学号及姓名
7. FROM student_Info
8. WHERE LEFT(student_ID,4)='2005'
第21教案 第6章 Transact-SQL编程基础(二)
课题:Transact-SQL编程基础(二)
目的要求:
掌握T-SQL流程控制语句的用法
掌握T-SQL系统内置函数的用法
掌握常用程序控制结构的分类和常用语句
掌握T-SQL系统自定义函数的用法
重点难点:
循环结构的设计
课外作业布置:
复习本节课内容,完成本章习题
6.5 流程控制语句
6.5.1 BEGIN…END语句
1.语法
BEGIN
SQL语句1
SQL语句2
…
END
2.参数说明
① 将要组合成语句块的语句放在BEGIN和END之间就可以了。
② BEGIN…END可以嵌套使用。
6.5.2 IF…ELSE语句
1.语法
IF 布尔表达式
SQL语句块
[ELSE
SQL语句块]
2.参数说明
① ELSE并不一定是必需的。
② 布尔表达式取真值时执行IF后面的语句块,取假值时执行ELSE后面的语句块。
③ IF…ELSE语句可以嵌套。此时需要注意嵌套的层次以及IF与哪一个ELSE配对。
【例6-9】编写程序完成如下功能:查看有无班级号为200501的班级,有则将这个班的学生信息全部输出,否则输出提示用户没有找到的信息。
1. IF EXISTS(SELECT * FROM class_info WHERE class_No='200501')
2. BEGIN
3. SELECT *
4. FROM student_Info
5. WHERE class_No='200501'
6. END
7. ELSE
8. PRINT '没有找到相关信息'
6.5.3 无条件转移(GOTO)语句
1.语法
GOTO 标号
…
标号:
2.参数说明
① GOTO语句会强迫服务器从标号处开始继续执行程序,标号必须是一个合法的标识符。
② 标号必须出现在同一个存储过程或批处理中。
③ 过多的使用GOTO会导致程序质量的下降,并且可
读性很差。因此建议可以使用IF…ELSE,WHILE语
句的地方就尽量不要使用GOTO。
【例6-10】先从result_Info表中取得course_No为1的记录数目,然后用它完成了一个GOTO语句。注意该程序是如何避免陷入死循环的。
1. DECLARE @记录数 INT,@记录号 INT
2. SELECT @记录数=count(*), @记录号=1
3. FROM result_Info WHERE course_No=1
4. LOOP:
5. IF @记录号<@记录数
6. BEGIN
7. SELECT @记录号 as 记录号
8. SET @记录号=@记录号+1
9. GOTO LOOP
10. END
6.5.4 WHILE、BREAK和CONTINUE语句
1.语法
WHILE 布尔表达式
SQL语句块
[BREAK]
SQL 语句块
[CONTINUE]
2.参数说明
① 布尔表达式返回真或假值来决定是否执行循环体中的语句。
② BREAK导致从最内层WHILE循环中退出,执行该层循环的END关键字后面的任何语句。
③ CONTINUE用在循环语句中,结束本次循环,重新转到下一次循环条件的判断。
【例6-11】计算1到100中奇数的和。
DECLARE @NUM INT, @SUM INT
SET @NUM=0
SET @SUM=0
WHILE @NUM<100
BEGIN
SET @NUM=@NUM+1
IF @NUM%2=0
CONTINUE
ELSE
SET @SUM=@SUM+@NUM
END
PRINT @SUM
这个程序中的CONTINUE是不能用BREAK来代替的。
6.5.5 RETURN语句
1.语法
RETURN [整型表达式]
2.参数说明
① RETURN语句用于从批处理、语句块中无条件的退出,不执行位于RETURN后面的语句。
② 在系统存储过程中返回0表示成功,返回非0值则表示失败。
6.5.6 WAITFOR语句
1.语法
WAITFOR DELAY 时间 | TIME 时间
2.参数说明
① WAITFOR语句的作用是当进程执行到该语句时暂时停止程序执行,直到所设定的等待时间已过或到了所设定的时间,才继续向下执行程序。
② 时间必须为datetime类型的数据,如14:25:36,不能包括日期。
③ DELAY用来设定等待的时间,TIME用来设定等待结束的时间点。
【例6-12】下面的程序的作用是系统等待2小时30分钟后执行SELECT操作。
WAITFOR DELAY '2:30:00'
SELECT *
FROM student_Info
参考:等到下午3:20开始执行
WAITFOR TIME '15:20'
SELECT *
FROM student_Info
6.6 系统内置函数
6.6.1 系统函数
1.CASE函数
CASE通常是用作多情况选择分支的流程控制语句。有简单CASE函数和搜索式CASE函数两种表达方式。
(1)简单CASE函数:
CASE 输入表达式
WHEN 值1 THEN 结果表达式1
[…n]
[ELSE 否则结果表达式]
END
执行过程:将输入表达式与当表达式逐个比较,若相等,则返回“结果表达式”,若都不相等,则返回“否则结果表达式”。
CASE函数应用举例:根据表course_info的course_start字段,显示每一门课程的开课学期。
1. use student
2. select course_name as 课程名,开课时间 =
3. case course_start
4. when '1' then '第一学期开课'
5. when '2' then '第二学期开课'
6. when '3' then '第三学期开课'
7. when '4' then '第四学期开课'
8. end
9. from course_info
搜索式CASE函数:
CASE
WHEN 条件表达式 THEN 结果表达式
[…n]
[ELSE 否则结果表达式]
END
执行过程:若条件表达式成立,则返回“结果表达式”,否则判断下一个条件表达式,如果所有条件表达式均不成立,则返回“否则结果表达式”
【例6-13】查询学号为 20050101 的学生各门课程的成绩,并将成绩转换为不同等级。
SELECT course_No,
CASE
WHEN result>=90 THEN '优秀'
WHEN result>79 AND result<90 THEN '良好'
WHEN result>69 AND result<80 THEN '中等'
WHEN result>=60 AND result<70 THEN '及格'
ELSE '不及格'
END AS '成绩等级'
FROM result_Info
WHERE student_ID=20050101
2.处理NULL值的函数
NULL值在SQL Server中是比较特殊的一种情况。作为列的值出现有时是必要的,但是在统计数据时会带来一些麻烦。比如有个学生是因为某种原因而一门功课记零分,那么使用AVG计算平均成绩时就应将这样的成绩排除在外。有3个函数可以用来协助处理数据库系统中的NULL值问题。
语法1:
NULLIF(表达式1,表达式2)
功能:如果两个表达式相等,则返回空值。如果两个表达式不相等,返回表达式1 的值。
说明:表达式可以是常量、列名、函数、子查询或算术运算符、按位运算符以及字符串运算符的任意组合。
【例6-14-1】下面的程序中NULLIF函数的使用是当result的值为0时则返回空值,因为AVG函数是忽略那些空值的记录的,即空值不参与运算。
SELECT AVG(NULLIF(result,0)) AS '平均成绩'
FROM result_Info
WHERE course_No='1'
格式2:
ISNULL(表达式,替换值)
功能:使用指定的替换值替换 NULL
说明:表达式是将被检查是否为 NULL的表达式,可以是任何类型的。
格式2:(COALESCE是联合的意思)
COALESCE(表达式1,表达式2[,…n])
功能:返回其参数列表中第一个非空表达式。
说明:表达式列表中至少需要有2个表达式。
【例6-14-3】student_info表,对地址为空的学生,如果有电话,则显示电话号码。
SELECT student_name as 姓名, COALESCE(address,tele_number) as 联系方式
FROM student_Info
3.类型转换函数
语法:
CAST(表达式 AS 数据类型)
CONVERT(数据类型([长度]),表达式[,样式])
参数说明:
CAST和 CONVERT函数可以将一种数据类型强制转换成新的数据类型。且CONVERT函数还可以把日期置换成不同的样式。
不允许给固定长度的数据类型指定长度值
样式101:mm/dd/yyyy 105:dd-mm-yyyy
111:yyyy/mm/dd 110:mm-dd-yyyy
例1:将student_name的数据类型由char(10)转换为char(4)
1. use student
2. select cast(student_name as char(4))
3. from student_info
4.关于当前会话的信息
下面的函数可以帮助你获得当前会话的信息,比如你以什么样的方式登录到服务器上的,你在数据库的用户名和拥有的权限等等。主要包括:
APP_NAME() 返回当前会话的应用程序名称
HOST_ID() 返回主机标识号,返回类型char(8)
HOST_NAME() 返回主机名,返回类型vchar
USER_NAME([user_id])返回给定标识号的数据库用户名,返回类型nvarchar(256)
例:
select app_name() as 应用程序名,host_id() 主机标识号,host_name() 主机名,user_name() 用户名
6.6.2 日期函数
日期时间函数用来操作datetime和
smalldatetime类型的数据,执行算术运算。
SQL Server所提供的日期函数在附录中。参考联机帮助文档。
【例6-17】使用DATENAME函数。
SELECT student_Name,DATENAME(Year,ru_Date) AS 入学年份
FROM student_Info
参数还有:Month,day,q,week ,weekday
6.6.3 字符串函数
字符串函数用于对字符串进行处理。
1.求字符串长度
语法:
LEN(字符串表达式)
参数说明:该函数以字符形式返回一个字符串的长度,计算长度时要去掉尾随空格。输入参数是任何形式的字符串表达式。
【例6-20】使用LEN函数。
DECLARE @chvE VARCHAR(20)
SET @chvE='SQL Server':
PRINT LEN(@chvE)
运行结果为10。
2.截取字符串(取子字符串)
语法:
LEFT(字符串表达式,n)
RIGHT(字符串表达式,n)
SUBSTRING(字符串表达式,n,m)
参数说明:
① SUBSTRING函数从字符串的开始位置n起,取出m长度的字符序列。
②字符串表达式是任何的字符、文本、图像或二进制的数据类型。由于n和m参数是基于字节数的,这样该函数可以处理文本、图像和二进制这样的数据类型表达式。
【例6-21】使用LEFT函数和SUBSTRING函数。
DECLARE @chvE VARCHAR(20)
SET @chvE='SQL Server'
SELECT LEFT(@chvE,3),RIGHT(@chvE,6),SUBSTRING(@chvE,3,3)
运行结果是“SQL”,“Server”和“L S”(中间有个空格)。
3.CHARINDEX函数
语法:
CHARINDEX(表达式1,表达式2[,n])
参数说明:
① 函数返回表达式1第一次在表达式2中出现的索引(位置)。
② 可选参数n用于指定搜索的开始位置。
【例6-22】使用CHARINDEX函数。
DECLARE @c1 VARCHAR(40),@c2 VARCHAR(10),@i INT
SET @c1='SQL Server is a DATABASE system.'
SET @c2='Server'
SET @i=CHARINDEX(@c2,@c1)
PRINT @i
4.字符串转换
LTRIM(字符串表达式)
RTRIM(字符串表达式)
STR(数值型表达式[,n[,m]])
CHAR(integer_expression)
参数说明:
① LTRIM和RTRIM函数分别用于将字符串前面和后面的空格删除。
② STR函数用于将数字值转换为字符串,n是总长度,包括小数点、符号、数字或空格。默认值为 10 m为小数位数。m为小数位数。
③ CHAR函数的参数是ASCII字符所对应的整数,结果是返回ASCII字符,与此相对应的有ASCII函数,却是将ASCII字符相对应的整数输出。
【例6-23】使用LTRIM函数。
SELECT LTRIM(RTRIM(' SQL Server '))
运行结果是SQL Server。注意首尾的空格已经去掉了。
【例6-24】使用STR函数。
SELECT STR(3.4,3,1)
运行结果是3.4,只不过这已经是字符串了。
6.6.4 数据函数
数据函数可对数据类型为整型integer、浮点型float、实型real、货币型money和smallmoney的表达式进行操作。
【例6-25】使用ROUND函数,四舍五入处理。
SELECT ROUND (24.5654,3)
运行结果是24.5650。
【例6-26】使用CEILING函数返回大于或等于所给数字表达式的最小整数 。
SELECT CEILING (45.5)
运行结果是46。
【例6-27】使用POWER(指数)函数,返回给定表达式乘指定次方的值。
SELECT POWER(4.00,3)
运行结果是64.00。
6.7 用户自定义函数
6.7.1 用户函数的定义与调用
用户函数需要用CREATE FUNCTION语句来创建,用ALTER FUNCTION语句来修改。通过sp_helptext系统存储过程来获取所创建函数的源代码。
用户创建函数时可以有0个、1个或多个参数,必须返回单一的值。返回值可以是标量,也可以是一个表。
1、标量函数
功能:返回一个值。
语法:
CREATE FUNCTION [ owner_name.] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] }
[ ,…n ] ] )
RETURNS scalar_return_data_type
[ WITH {ENCRYPTION | SCHEMABINDING} [ [,] …n] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
参数说明:
① 语法比较复杂,但大致是这样几个部分:函数名,参数列
表,返回值类型,函数体。
② 函数名部分:owner_name指函数的拥有者。function_name指函数名称。要符合T-SQL标识符命名规则。
③ 参数列表部分:@parameter_name指参数名。scalar_parameter_data_type指参数的数据类型,不能是text、ntext、image和timestamp,也不能是用户自定义数据类型。
④ 返回值类型:用scalar_return_data_type指定。
⑤ 函数体部分:用BEGIN…EDN括起来。
⑥ 其他部分:WITH ENCRYPTION用于对函数的定义语句进行加密。WITH SCHEMABINDING用于将函数绑定到它所引用的数据库对象上。
【例6-28】编写一个程序:输入一个日期后,返回该日期所在的季度。
CREATE FUNCTION fnQuarterString(@dtmDate datetime)
RETURNS char(6)
AS
BEGIN
RETURN (DateName(q,@dtmDate)+'Q'+DateName(yyyy,@dtmDate))
End
这个程序的关键部分是靠系统函数DateName()来完成的,其中参数q表示季,同quarter,参数yyyy表示年,同year。
引用方法1:用select命令
如:select dbo.fnQuarterString(‘2009-04-27’)
引用方法2:用print命令
如:print dbo.fnQuarterString(‘2009-04-27’)
2、内置表值函数
功能:返回一个表。
建立语法:
CREATE FUNCTION [ owner_name.] 函数名
( [ @参数名 [AS] 类型 [ = 默认值 ] [ ,…n ] ] )
RETURNS TABLE
[ WITH {ENCRYPTION | SCHEMABINDING} [ [,] …n] ]
[ AS ]
RETURN (select 语句)
例:建立一个函数F1,返回一个表,内容是选修了指定课程号的学生姓名、班级、电话
CREATE FUNCTION F1(@cno char(10))
RETURNS TABLE
AS RETURN
( select student_name,class_no,tele_number
from student_info,result_info
Where student_info.student_id=result_info.student_id and course_no=@cno
)
调用方法:
select * from F(‘1’)
3、多语句表值函数
功能:建立函数的同时建立一个表,并把对应的记录内容输入到新建表中。调用方法同内置表值函数。
建立语法:
CREATE FUNCTION [ owner_name.] 函数名
( [ @参数名 [AS] 类型 [ = 默认值 ] [ ,…n ] ] )
RETURNS @变量名 TABLE (表列定义)
[ WITH {ENCRYPTION | SCHEMABINDING} [ [,] …n] ]
[ AS ]
BEGIN
函数体
RETURN
END
例:要求同上:建立一个函数F2,返回一个表,内容是选修了指定课程号的学生姓名、班级、电话
CREATE FUNCTION F2(@cno char(10))
RETURNS @tab TABLE
(姓名 char(10),
班级 int,
电话 char(10)
)
AS
BEGIN
insert @tab
select student_name,class_no,tele_number
from student_info,result_info
Where student_info.student_id=result_info.student_id and course_no=@cno
RETURN
END
调用方法:
select * from F2(‘2’)
6.7.2 用户定义函数的删除
语法:
DROP FUNCTION {[所有者.]函数名}[,…n]
参数说明:
该语句一次可以删除多个用户定义函数。
练习
1、定义一个函数F3,利用student库的表student_info,根据其学号,返回对应的年龄。
2、创建一个函数F4,以课程号为参数,功能是查找选修了该门课程的学生姓名和成绩。
第22教案 实训11:T-SQL语句用法(二)
实训11:T-SQL语句用法(二)
(一)、实训目的
通过实训掌握T-SQL流程控制结构的用法
通过实训掌握系统内置函数的方法
通过实训掌握使用自定义函数的定义和调用方法
通过实训掌握程序流程结构的
展开阅读全文