SQL Server 自定义函数(Function)

article/2025/9/24 18:42:25

SQL Server 自定义函数(Function)——参数默认值

sql server 自定义函数分为三种类型:标量函数(Scalar Function)、内嵌表值函数(Inline Function)、多声明表值函数(Multi-Statement Function)

标量函数:标量函数是对单一值操作,返回单一值。

内嵌表值函数:内嵌表值函数的功能相当于一个参数化的视图。它返回的是一个表,内联表值型函数没有由BEGIN-END 语句括起来的函数体。

多声明表值函数:它的返回值是一个表,但它和标量型函数一样有一个用BEGIN-END 语句括起来的函数体,返回值的表中的数据是由函数体中的语句插入的。

它可以进行多次查询,对数据进行多次筛选与合并,弥补了内联表值型函数的不足。

 

创建标量函数的语法:

复制代码

1 create function [函数的所有者].函数名(标量参数 [as] 标量参数类型 [=默认值])
2 returns 标量返回值类型
3 [with {Encryption | Schemabinding }]
4 [as]
5 begin
6     函数体(即 Transact-SQL 语句)
7     return 变量/标量表达式
8 end

复制代码

下面自定义一个根据传入参数(即学生性别)来计算学生平均身高的 Function,示例如下:

按 Ctrl+C 复制代码

 

按 Ctrl+C 复制代码

执行用户自定义标量函数:

1 select [函数的所有者].函数名 as 字段别名
2 
3 select dbo.AvgHeight(default) as AvgHeight;    --返回 179
4 select dbo.AvgHeight('男');     --返回 179
5 select dbo.AvgHeight('女');     --返回 176

PS:创建函数时指定了函数所有者,那么调用的时候也必须指定函数的所有者。(一般都为 dbo)

调用自定义函数时如果想不传入参数而使用默认值,那么必须使用 default 关键字。如果自定义函数的参数没有默认值,那么会返回 null。

 

创建内嵌表值函数语法:

1 create function [函数的所有者].函数名(标量参数 [as] 标量参数类型 [=默认值])
2 returns table
3 [with {Encryption | Schemabinding }]
4 [as]
5 return(单个 SELECT 语句,确定返回的表的数据。)

下面自定义一个根据传入参数(即学生学号)来查询学生信息的 Function,示例如下:

复制代码

 1 use Test2 go3 4 create function dbo.SearchStuInfo(@Stu_No varchar(50)='001')5 returns table6 as7 return(8 select S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate 9 from Student where S_StuNo=@Stu_No)
10 go

复制代码

执行用户自定义内嵌表值函数:

1 select * from dbo.SearchStuInfo(default);    --返回学号为 001 的学生信息
2 
3 select * from dbo.SearchStuInfo('008');        --返回学号为 008 的学生信息

 

创建多声明表值函数的语法:

复制代码

1 create function [函数的所有者].函数名(标量参数 [as] 标量参数类型 [=默认值])
2 returns @表变量 table 表的定义(即列的定义和约束)
3 [with {Encryption | Schemabinding }]
4 [as]
5 begin
6     函数体(即 Transact-SQL 语句)
7     return
8 end

复制代码

下面自定义一个根据传入参数(即学生学号)来查询学生信息和课程,并计算出该学生的身高是否大于所有学生的平均身高的 Function,示例如下:

复制代码

 1 use Test2 go3 4 create function dbo.SearchStuCou(@StuN varchar(10)='001')5 returns @StuInfo table (6     StuNo varchar(50) not null primary key,7     StuName varchar(10) not null,8     StuSex  varchar(10) not null,9     StuHeight varchar(10) null,
10     StuAvgHeight decimal(10,2) null,
11     StuConAvgHeight varchar(30) null,
12     StuCou varchar(10) null
13 )
14 as
15 begin
16     declare @Height decimal(10,2)
17     declare @AvgHeight decimal(10,2)
18     declare @ConAvgHeight varchar(30)
19 
20     select @AvgHeight=AVG(Convert(decimal(10,2),S_Height))        --查询所有同学的平均身高
21     from Student 
22 
23     select @Height=Convert(decimal(10,2),S_Height)        --查询指定学号的学生身高
24     from Student 
25     where S_StuNo=@StuN
26 
27     if((@Height-@AvgHeight) > Convert(decimal(10,2),0))
28     begin
29         set @ConAvgHeight='大于平均身高'
30     end
31     else if((@Height-@AvgHeight) = Convert(decimal(10,2),0))
32     begin
33         set @ConAvgHeight='等于平均身高'
34     end
35     else
36     begin
37         set @ConAvgHeight='小于平均身高'
38     end
39 
40     insert into @StuInfo(StuNo,StuName,StuSex,StuHeight,StuAvgHeight,StuConAvgHeight,StuCou)
41     select s.S_StuNo,s.S_Name,s.S_Sex,s.S_Height,@AvgHeight,@ConAvgHeight,c.C_Name from Student s 
42     left join Course c on s.C_S_Id=c.C_Id
43     where S_StuNo=@StuN 
44 
45     return
46 end
47 go

复制代码

执行用户自定义多声明表值函数:

1 select * from dbo.SearchStuCou(default);
2 
3 select * from dbo.SearchStuCou('015');
4 
5 select * from dbo.SearchStuCou('009');

适用范围

1.      只查询,不修改数据库的状态(修改、删除表中记录等)

2.      结果集需要通过递归等方法得到时,可以使用函数,函数比较灵活

3.      结果集需要直接被引用时,可以使用函数。需要对结果集进行再加工(指放在select语句中等),可以使用函数,函数可以嵌在select等sql语句中。

注意事项:

用户自定义函数不能用于执行一系列改变数据库状态的操作

在编写自定义函数时需要注意的:

对于标量函数:

1.      所有的入参前都必须加@

2.      create后的返回,单词是returns,而不是return

3.      returns后面的跟的不是变量,而是返回值的类型,如:int,char等。

4.      在begin/end语句块中,是return。

内嵌表值函数:

1.      只能返回table,所以returns后面一定是TABLE

2.      AS后没有begin/end,只有一个return语句来返回特定的记录。

多语句表值函数:

1.      returns后面直接定义返回的表类型,首先是定义表名,表明前面要加@,然后是关键字TABLE,最后是表的结构。

2.      在begin/end语句块中,直接将需要返回的结果insert到returns定义的表中就可以了,在最后return时,会将结果返回。

3.      最后只需要return,return后面不跟任何变量。

参考:

http://www.cnblogs.com/xueyuangudiao/archive/2011/08/03/2126580.html


http://chatgpt.dhexx.cn/article/DOFr97bQ.shtml

相关文章

mysql自定义函数实现

mysql自定义函数实现 环境准备 查看mysql版本 select version();查看mysql存储引擎 show variables like %storage_engine%;创建测试表 CREATE TABLE dsp_user_media_tag (id int(11) NOT NULL AUTO_INCREMENT,imei varchar(50) COLLATE utf8_bin DEFAULT NULL,tagname va…

MySQL自定义函数用法详解

MySQL自定义函数用法详解-复合结构自定义变量/流程控制 自定义函数 (user-defined function UDF)就是用一个象ABS() 或 CONCAT()这样的固有(内建)函数一样作用的新函数去扩展MySQL。 所以UDF是对MySQL功能的一个扩展 创建和删除自定义函数语法: 创建UDF:…

SQL server 自定义函数FUNCTION的使用

前言: 在SQL server中不仅可以可以使用系统自带的函数(时间函数、聚合函数、字符串函数等等),还可以根据需要自定义函数。 一、定义: 用户自定义函数的类型: 1、标量值函数(返回一个标量值&a…

功能测试用例设计方法分享

测试用例可以用来衡量一个项目测试质量,因此在平时的测试流程中,编写测试用例就是测试过程中很重要的一步,每一个测试工程师都需要并且非常熟练的编写测试用例,能在编写测试用例中尽可能的覆盖任何异常的测试点;如何能…

判定表测试用例方法——实例

测试用例设计方法——判定表法 判定表法表示的是有多个输入,和多个输出,而且输入与输入之间有相互的组合关系、输入和输出之间有相互的制约和依赖关系, 判定表由四个组成部分 判定表基本概念  条件桩:输入条件, 列出了系统的所有输入&…

测试用例编写方法

测试用例编写方法 等价类划分法 一、等价类划分法的定义 把程序的输入域和输出域划分成若干部分,然后从各个部分中选取若干代表性数据作为测试用例。这些数据在测试中的作用等价于其所属部分的其他值。 二、等价类划分法的术语 等价类:输入域的各个…

软件测试用例设计方法(一)

目录 软件测试用例设计之等价类划分法一、等价类划分法的定义二、等价类划分法的术语三、等价类划分原则四、实例演示(三角形问题和档案管理系统问题) 软件测试用例之边界值分析法一、边界值分析法定义二、等价类划分法和边界值分析法的区别三、内部边界…

测试用例方法-判定表法

判定表法案例 若用户欠费或关机,则不允许主被叫 等价类划分法和边界值分析法都是着重考虑单个输入的输入条件,但是没有考虑输入条件的各种组合,输入条件与输出条件之间的相互制约关系。所以要使用判定表法才能解决上述案例编写测试用例的过…

编写测试用例方法之错误推测法

今天我们再来介绍另外一个编写测试用例的方法:错误推测法。话不多说,开始整干货,老规矩,首先全图镇楼。 错误推测法其实它不同于等价类划分法或者边界值分析法,它是对有效等价类和边界值分析法的一个补充。因为错误推测…

【测试】编写测试用例的常用方法

文章目录 1)等价类划分法1.1 什么是等价类有效等价类:无效等价类: 1.2 划分标准1.3 划分方法1、确立等价类2、转化为测试用例 1.4 实例:三角形问题1.4.1 分析对输入条件的要求(显性和隐性)1.4.2 列出等价类…

编写测试用例的方法

编写测试用例的方法 一、等价类划分法(重点)1、应用场景:多用于输入框。2、概念:3、等价类:4、示例: 二、边界值法(重点)三、场景法(重点)1、概念&#xff1a…

编写测试用例的七种方法

1 测试用例的概念 测试用例是为了实施测试而向被测试系统提供的一组集合,这组集合包括:测试环境、操作步骤、测试数据、预期结果等要素 2 常见编写测试用例的七种方法 基于需求的设计方法 等价类 边界值 因果图 场景设计法 错误猜测法 3 基于需…

【路径规划】(4) 蚁群算法,附python完整代码

大家好,今天和各位分享一下蚁群算法,并基于 tkinter 完成一个旅行商问题。完整代码可以从我的 GitHub 中获得: https://github.com/LiSir-HIT/Mathematical-Programming/tree/main/Path%20Planning 1. 算法介绍 蚁群算法是由 Mr.Dorigo 博士…

Python编程实现蚁群算法详解

这篇文章主要介绍了Python编程实现蚁群算法详解,涉及蚂蚁算法的简介,主要原理及公式,以及Python中的实现代码,具有一定参考价值,需要的朋友可以了解下 简介 蚁群算法(ant colony optimization, ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型算法。它由Marco…

智能优化算法:蝙蝠算法-附代码

智能优化算法:蝙蝠算法-附代码 文章目录 智能优化算法:蝙蝠算法-附代码1.算法原理2.算法流程3.算法结果4.参考文献5.MATLAB代码6.python代码 摘要:蝙蝠算法(Bat Algorithm,BA)[1] 是受蝙蝠回声定位捕食行为…

蚁群算法介绍(python)

蚁群算法 什么是蚁群算法 蚁群算法(ant colony optimization, ACO),又称蚂蚁算法,是仿照蚂蚁寻找食物的最短路径行为来设计的仿生算法,是一种概率型算法,适用于优化组合问题。 特点 对图的对称性和目标函数无特殊要求可以解决…

蝙蝠优化算法(python代码)

1.效果图 2.代码 import numpy as np import math import matplotlib.pyplot as plt# 定义目标函数(示例函数为Rastrigin函数) def rastrigin(x):return 10 * len(x) + np.sum(x**2 - 10 * np.cos(2 * np.pi * x))# 蝙蝠优化算法函数 def bat_algorithm(f, D, N, N_gen, A,…

蚁群算法Python实现

解决的问题 三维地形中,给出起点和重点,找到其最优路径。 作图源码: from mpl_toolkits.mplot3d import proj3d from mpl_toolkits.mplot3d import Axes3D import numpy as npheight3d np.array([[2000,1400,800,650,500,750,1000,950,900…

蚁群算法原理与实现(python)

文章目录 蚁群算法的背景蚁群算法的思想蚁群算法的python实现实例总结 蚁群算法的背景 古有牛顿在苹果树下被苹果砸中发现万有引力,三十年前有人观察蚂蚁觅食发明蚁群算法。蚁群算法是意大利学者Dorigo、Maniezzo等人于20世纪90年代看蚂蚁觅食发明的。蹲在地上看蚂…

Python实现HBA混合蝙蝠智能算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝙蝠算法是2010年杨教授基于群体智能提出的启发式搜索算法,是一种搜索全局最优解的有效方法…