SQL Sever中的函数分为两大类:
系统内置函数、用户定义函数
系统内置函数:
CASE函数
(1)简单的CASE函数
语法格式:
CASE input_expression
WHEN when_expression THEN result_expression[…n]
[ELSE else_result_expression]
END
- 计算input_expression表达式的值,并与每一个when_expression表达式的值比较:
若相等,则返回对应的result_expression表达式的值;
否则,返回else_result_expression表达式的值。 - 参数input_expression和when_expression的数据类型必须相同(或可以隐性转换)。
- n表示可以使用多个WHEN when_expression THEN result_expression子句。
例:查询所有学生的学号和性别。要求使用简单CASE函数将XSDA表中性别列的值由“男”、“女”替换成“男生”、“女生”进行显示,性别列的标题为sex。
SELECT 学号,sex=
CASE 性别
WHEN ‘男' THEN ‘男生'
WHEN ‘女' THEN ‘女生'
END
FROM XSDA
(2)搜索型CASE函数
语法格式:
CASE
WHEN Boolean_expression THEN result_expression[…n]
[ELSE else_result_expression]
END
按指定顺序为每个WHEN子句的Boolean_expression表达式求值。
返回第一个取值为TRUE的Boolean_expression表达式对应的result_expression表达式的值;
如果没有取值为TRUE的Boolean_expression表达式,则当指定ELSE子句时,返回else_result_expression的值;
若没有指定ELSE子句,则返回NULL。
例:查询XSDA表中所有学生的学号和性别,要求使用搜索型CASE函数将性别列的值由“男”、“女”替换成“男生”、“女生”进行显示,性别列的标题为sex。
SELECT 学号, sex=
CASE
WHEN 性别= '男' THEN '男生'
WHEN 性别= '女' THEN '女生'
END
FROM XSDA
用户定义函数
1.标量函数
2.内嵌表值函数
标量函数
对单一值进行运算,然后返回单一值。
若用户定义函数的返回值为标量值,则该函数称为标量函数。
定义标量函数
语法格式:
CREATE FUNCTION function_name /*函数名部分*/
([{@parameter_name [AS] parameter_data_type [=default]}[,…n]]) /*形参定义部分*/
RETURNS return_data_type /*返回值类型*/
[AS]
BEGIN
function_body /*函数体部分*/
RETURN expression /*返回语句*/
END
function_name:函数名。在数据库中必须是唯一的。
@parameter_name:函数的形参名。
parameter_data_type:参数的数据类型。
return_data_type:返回值类型。
function_body:由T-SQL语句序列构成的函数体。
函数返回expression表达式的值。
例:定义一函数sum_G,求某学生的总分。
XSCJ(学号, 课程编号,成绩)
Create function sum_G(@Snum char(6))
RETURNS int
AS
BEGIN
DECLARE @总分 int
select @总分 =sum(成绩)
from XSCJ
where 学号=@Snum
RETURN @总分
END
调用标量函数
以下两种方式调用标量函数:
① 利用SELECT语句调用
语法格式:dbo.函数名(实参1,…,实参n)
例:调用上例定义的函数,求学号为201501的学生的总分。
Declare @num1 char(6)
Declare @sum1 int
Set @num1=‘201501’
Select @sum1=dbo.sum_G(@num1) /*dbo: 数据库所有者此处必写!!!*/
Select @sum1
① 利用EXECUTE语句调用
语法格式:dbo.函数名(实参1,…,实参n)
例:调用上例定义的函数,求学号为201501的学生的总分。
Declare @num1 char(6)
Declare @sum1 int
Set @num1=‘201501’
exec @sum1=dbo.sum_G(@num1) /*dbo: 数据库所有者此处必写!!!*/
Select @sum1
或: dbo.函数名形参名1=实参1,...,形参名n=实参n
Declare @总分2 int
exec @总分2= dbo.sum_G @snum='201501'
Select @总分2
内嵌表值函数
定义内嵌表值函数
语法格式:
CREATE FUNCTION [owner_name.]function_name /*定义函数名部分*/
(@parameter_name parameter_data_type[,…n]) /*定义形参部分*/
RETURNS TABLE /*返回值为表类型
AS RETURN
SELECT语句 /*通过SELECT语句返回内嵌表
RETURNS子句仅包含关键字TABLE,表示此函数返回一个表(即SELECT 语句的结果)。
内嵌表值函数的函数体仅有一个RETURN语句,并通过SELECT语句返回内嵌表值。
TABLE指定表值函数的返回值为表。只有常量和@local_variables可以传递到表值函数。
在内联表值函数中,TABLE返回值是通过单个SELECT语句定义的。内联函数没有关联的返回变量。
语法格式中的其他参数项同标量函数的定义。
例:创建函数查询某学生的各科成绩信息。
XSCJ(学号, 课程编号,成绩)
CREATE FUNCTION XS_成绩 (@stu_no char(6))
RETURNS TABLE
AS RETURN
SELECT 学号,课程编号,成绩
FROM XSCJ
WHERE 学号= @stu_no
调用以上函数,查询学号为“200801”学生的各科成绩。
SELECT * FROM XS_成绩 (‘200801’)
例:创建函数查询某学生的各科成绩,要求学号,姓名,课程名称,成绩。
CREATE FUNCTION XS_成绩 (@stu_no char(6))
RETURNS TABLE
AS RETURN
SELECT 学号,姓名,课程名称,成绩
FROM xsda,kcxx,xscj
WHERE xsda.学号=xscj.学号 and
调用以上函数,查询学号为“200801”学生的各科成绩。
SELECT * FROM XS_成绩 (‘200801’)
删除用户定义函数
语法格式:
DROP FUNCTION {[owner_name.]function_name} [,…n]
owner_name:指所有者名。
function_name:指要删除的用户定义的函数名称。
n:表示可以指定多个用户定义的函数予以删除。
例:删除函数XS_成绩
DROP FUNCTION XS_成绩