012 数据库学习笔记--自定义函数

发布时间 2023-06-12 15:25:14作者: sunwugang

自定义函数:根据自己的需要,自定义一些函数

分类:标量函数、内嵌表值函数、多声明表值函数

  • 标量函数:
    • 对单一值的操作,返回单一值;
    • 包含 begin end
    • 创建的时候,指定了函数所有体,调用时也必须指定函数所有者
    • 调用时,如果函数中指定了默认值,调用的时候,可使用默认值default代替
    • 在语法上 returns 之后为返回值类型,含begin end  ;最后return 返回值
  • 内嵌表值函数:
    • 参数话的试图,返回的是一个表;
    • 没有 begin end 包括起来
  • 多声明表值函数:
    • 返回的也是一个表,包含 begin end 函数体;
    • 返回的表数据由函数体重的语句插入的;
    • 可多次查询,可以多次筛选与合并,弥补了内嵌表值函数的不足;

标量函数:

--语法
create function [函数的所有者].函数名(标量参数 [as] 标量参数类型 [=默认值])
 returns 标量返回值类型
 begin
     函数体(即 Transact-SQL 语句)
--注,不可以有修改数据的操作 return 变量/标量表达式 end

示例: 

--------------------标量函数--------------------
--示例一:按照指定分隔符进行分割,返回分割后的个数
create function GetStrCountBySplitchar
(
	@originlStr varchar(500), --要分割的字符串
	@split		varchar(10)  --分隔符
)
returns int
as
begin
	declare @location int,--定义起始位置
			@start    int,--定义从第几个开始
			@length	  int;--定义变量,用于接收计算元素的个数
	set @originlStr=ltrim(rtrim(@originlStr))--去掉左右两边的空格
	set @location=charindex(@split,@originlStr) --分割符号在字符串中第一次出现的位置(索引从1开始计数)
	set @length=1
	while @location<>0
	begin
		set @start=@location+1
		set @location=charindex(@split,@originlStr,@start)
		set @length=@length+1
	end
	return @length
end
go
select dbo.GetStrCountBySplitchar('腹部彩超,腹部B超,腹部平扫',',') as 检查项目数量 --返回检查项目个数
go

--示例二  根据学生名称获取学生信息
--CAST(@student_age AS varchar)
--CONVERT(varchar,2) 
--标量函数,返回单一值 查询使用
create function GetStudentByName
(
	@student_name varchar(100) 
)
returns varchar(100)
-- with encryption
as
begin 
	declare @student_sex varchar(100), @student_age int,@stuInfo varchar(200)
	select @student_sex = student_sex,@student_age=student_age from student where student_name=@student_name
	--select赋值  等价于set 
	select @stuInfo = @student_name +','+@student_sex+','+ CONVERT(varchar,@student_age)-- CAST(@student_age AS varchar)
	return @stuInfo 
end
go

--select * from [dbo].[student]
--调用自定义函数
select [dbo].[GetStudentByName]('kunkun') as 学生信息
go

--示例三 使用默认值
create function GetStudentByNameOrDefault
(
	@student_name varchar(100) ='kunkun'
)
returns varchar(100)
-- with encryption
as
begin 
	declare @student_sex varchar(100), @student_age int,@stuInfo varchar(200)
	select @student_sex = student_sex,@student_age=student_age from student where student_name=@student_name
	--select赋值  等价于set 
	select @stuInfo = @student_name +','+@student_sex+','+ CONVERT(varchar,@student_age)-- CAST(@student_age AS varchar)
	return @stuInfo 
end
go

select * from [dbo].[student]
--调用自定义函数 + 使用默认值调用
select [dbo].GetStudentByNameOrDefault(default) as 学生信息