【Sql Server】随机查询一条表记录,并重重温回顾下自定义函数的封装和使用

大家好,我是全栈小5,欢迎来到《小5讲堂》。
这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解。
温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!

在这里插入图片描述

目录

  • 前言
  • 随机查询语句
  • 自定义函数
    • 基本概念
    • 函数格式
    • 函数例子
    • 函数封装
  • 文章推荐

前言

温故而知新,最近在写sql查询语句,需求是随机查询表的其中一条记录。
基于这个查询,顺便把数据库自定义函数、存储过程这个两个知识点重温固定下。
因此,本篇文章将在随机查询一条表记录的基础上,把sql语句封装到函数和存储过程里。

随机查询语句

要在SQL Server中随机生成一条记录,可以使用ORDER BY NEWID()来随机排序结果集,并使用TOP 1来限制结果集返回一条记录。
例如:

select top 1 * 
from(
select '张三11' as name union all select '张三22' as name union all 
select '张三33' as name union all select '张三44' as name union all
select '张三55' as name union all select '张三66' as name union all
select '张三77' as name union all select '张三88' as name
) a
order by newid()select '张三11' as name union all select '张三22' as name union all 
select '张三33' as name union all select '张三44' as name union all
select '张三55' as name union all select '张三66' as name union all
select '张三77' as name union all select '张三88' as name

在这里插入图片描述

自定义函数

基本概念

SQL Server中的函数可以分为两类:系统函数和用户自定义函数。
1.系统函数
这些函数是由SQL Server提供的内置函数,用于执行各种操作,如字符串处理、数学运算、日期时间处理等。
例如,LEN()用于返回字符串的长度,GETDATE()用于返回当前日期和时间等。
2.用户自定义函数
这些函数是用户根据自己的需求自定义的函数,可以根据业务逻辑执行特定的操作。
用户自定义函数分为以下几种类型:

  • 标量函数(Scalar Function):接受零个或多个参数,并返回单个值。
  • 表值函数(Table-Valued Function):接受零个或多个参数,并返回一个表作为结果集。
  • 内联表值函数(Inline Table-Valued Function):类似于表值函数,但是可以直接在查询中调用,并且返回的表可以与其他表进行联接。
  • 多语句表值函数(Multi-Statement Table-Valued Function):与内联表值函数不同,它可以包含多条SQL语句,并且使用RETURN语句返回结果集。
    用户自定义函数可以帮助简化复杂的查询和数据处理操作,并提高代码的可维护性和可重用性。

函数格式

在 SQL Server 中,函数的基本格式如下:

CREATE FUNCTION [schema_name.]function_name
(@parameter1 datatype,@parameter2 datatype
)
RETURNS return_datatype
AS
BEGIN-- 函数逻辑RETURN return_value;
END;
  • schema_name:函数所属的模式(可选)。
  • function_name:函数的名称。
  • @parameter1, @parameter2:函数的参数列表,包括参数名和数据类型。
  • return_datatype:函数的返回值数据类型。
  • RETURN return_value:函数体内的逻辑操作,可以包括各种 SQL 语句和控制流程,最终通过 RETURN 语句返回结果。

函数例子

当在 SQL Server 中创建自定义函数时,可以选择创建标量函数、表值函数或者内联表值函数。
以下是创建这些类型函数的基本方法示例:
1. 创建标量函数(Scalar Function)
标量函数接受零个或多个参数,并返回单个值。

-- 创建标量函数CREATE FUNCTION dbo.CalculateAge
(@BirthDate DATE
)
RETURNS INT
AS
BEGINDECLARE @Age INT;SET @Age = DATEDIFF(YEAR, @BirthDate, GETDATE());RETURN @Age;
END;
GO-- 调用标量函数SELECT dbo.CalculateAge('1990-01-01') AS Age;

2. 创建表值函数(Table-Valued Function)
表值函数可以返回一个表作为结果集。
内联表值函数(Inline Table-Valued Function)
内联表值函数可以直接在查询中使用。

-- 创建内联表值函数CREATE FUNCTION dbo.GetEmployeesByDepartment
(@DepartmentID INT
)
RETURNS TABLE
AS
RETURN
(SELECT EmployeeID, EmployeeNameFROM EmployeesWHERE DepartmentID = @DepartmentID
);
GO-- 调用内联表值函数SELECT * FROM dbo.GetEmployeesByDepartment(1);

多语句表值函数(Multi-Statement Table-Valued Function)
多语句表值函数包含多条 SQL 语句,并使用 RETURN 语句返回结果集。

-- 创建多语句表值函数CREATE FUNCTION dbo.GetEmployeesBySalaryRange
(@MinSalary DECIMAL(10, 2),@MaxSalary DECIMAL(10, 2)
)
RETURNS @Employees TABLE
(EmployeeID INT,EmployeeName NVARCHAR(100),Salary DECIMAL(10, 2)
)
AS
BEGININSERT INTO @Employees (EmployeeID, EmployeeName, Salary)SELECT EmployeeID, EmployeeName, SalaryFROM EmployeesWHERE Salary BETWEEN @MinSalary AND @MaxSalary;RETURN;
END;
GO-- 调用多语句表值函数SELECT * FROM dbo.GetEmployeesBySalaryRange(30000, 50000);

函数封装

在封装的时候,函数内部也是会有一些限制,比如下面:
在函数内对带副作用的运算符 ‘newid’ 的使用无效。
在函数内对带副作用的运算符 ‘PRINT’ 的使用无效。
在这里插入图片描述
在这里插入图片描述

create function getName
(@id int,
@newid varchar(50))
returns nvarchar(50)
as
begindeclare @my_name nvarchar(50)select top 1 @my_name=nameValuefrom(select 1 as id,'张三11' as nameValue union all select 2 as id,'张三22' as name union all select 3 as id,'张三33' as nameValue union all select 4 as id,'张三44' as name union allselect 5 as id,'张三55' as nameValue union all select 6 as id,'张三66' as name union allselect 7 as id,'张三77' as nameValue union all select 8 as id,'张三88' as name) awhere id=1--order by CHECKSUM(@newid)--print(@my_name)return @my_name
endselect dbo.getName(8,newid())

文章推荐

【Sql Server】随机查询一条表记录,并通过函数方式进行封装使用

【Sql Server】锁表如何解锁,模拟会话事务方式锁定一个表然后进行解锁

【Sql Server】通过Sql语句批量处理数据,使用变量且遍历数据进行逻辑处理

【新星计划回顾】第六篇学习计划-通过自定义函数和存储过程模拟MD5数据

【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点

【Sql Server】Update中的From语句,以及常见更新操作方式

【Sql server】假设有三个字段a,b,c 以a和b分组,如何查询a和b唯一,但是c不同的记录

【Sql Server】新手一分钟看懂在已有表基础上修改字段默认值和数据类型

总结:温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/334878.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB数据库(10亿条数据)清理策略: 自动化过期数据删除实战

1、引言 随着应用程序和业务数据的持续增长,有效地管理数据库存储空间成为维护系统性能的关键。在MongoDB这类NoSQL数据库中,定期清理过期数据变得尤为重要,这不仅能释放宝贵的存储资源,还能优化查询性能,确保数据库运…

5,串口编程---实现简单的用串口发送接收数据

单片机通过串口向PC机发送数据 PC机通过串口接收单片机发过来的数据 1.UART和USART的区别: USART支持同步通信方式,可以通过外部时钟信号进行同步传输,而UART仅支持异步通信方式 本开发板STM32F103ZET6有5个串口,用串口1作调试串口,因为串…

让AI学相机对焦: Learning to AutoFocus

前言 分析来自谷歌发表在 CVPR 2020 上的论文 Learning to Autofocus :https://arxiv.org/pdf/2004.12260 目前网上对这篇论文的分析较少,有的分析并没有指出关键点,如:论文解读: Learning to AutoFocus-CSDN博客&am…

spring常用知识点

1、拦截器和过滤器区别 1. 原理不同: 拦截器是基于java的反射机制,而过滤器采用责任链模式是基于函数回调的。 2. 使用范围不同: 过滤器Filter的使用依赖于Tomcat等容器,导致它只能在web程序中使用 拦截器是一个Sping组件&am…

jQuery 常用API

一、jQuery 选择器 1、jQuery 基础选择器 原生JS获取元素方式很多,很杂,而且兼容性情况不一致,因此jQuery给我们做了封装,使获取元素统一标准 2、jQuery 层级选择器 3、隐式迭代 遍历内部 DOM 元素(伪数组形式存储&am…

存储+调优:存储-IP-SAN-EXTENSION

存储调优:存储-IP-SAN-EXTENSION 文件系统的锁标记 GFS(锁表空间) ----------- ------------ ------------- 节点 | ndoe1 | | node2 | | node3 | ---------- ------…

STM32建立工程问题汇总

老版本MDK,例如MDK4 工程内容如下: User文件夹中存放main.c文件,用户中断服务函数(stm32f1xx.it.c),用户配置文件(stm32f1xx_hal_conf.h)等用户程序文件,或者mdk启动程序…

Spring Cloud Gateway 网关

一. 什么是网关(Gateway) 网关就是一个网络连接到另一个网络的关口。 在同一个项目或某一层级中,存在相似或重复的东西,我们就可以将这些相似重复的内容统一提取出来,向前或向后抽象成单独的一层。这个抽象的过程就是…

AURIX TC3xx单片机介绍-启动过程介绍3

如下的内容是英文为主,对于TC3xx芯片启动原理不清楚的,可以给我留言,我来解答你们的问题! 3.2.1 Reset类型识别 Reset类型的识别是用来判断上次的复位是Application Reset还是System Reset还是CPU0 Reset。基于复位的原因,启动软件会运行不同的分支逻辑。复位原因可以通…

常用目标检测预训练模型大小及准确度比较

目标检测是计算机视觉领域中的一项重要任务,旨在检测和定位图像或者视频中的目标对象。当人类观看图像或视频时,我们可以在瞬间识别和定位感兴趣的对象。目标检测的目标是使用计算机复制这种智能。 近年来,目标检测网络的发展日益成熟&#…

Java GC问题排查的一些个人总结和问题复盘

个人博客 Java GC问题排查的一些个人总结和问题复盘 | iwts’s blog 是否存在GC问题判断指标 有的比较明显,比如发布上线后内存直接就起飞了,这种也是比较好排查的,也是最多的。如果单纯从优化角度,看当前应用是否需要优化&…

【PB案例学习笔记】-11动画显示窗口

写在前面 这是PB案例学习笔记系列文章的第11篇,该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码,小凡都上传到了gite…

IDEA2024创建maven项目

1、new->project 2、创建后展示 3、生成resources文件夹 4、测试--编写一个hello文件

5.28学习总结

java复习总结 hashcode()和equals() hashcode():在Object里这个方法是通过返回地址的整数值来生成哈希值。 equals():在Object里这个方法是通过比较他们的内存地址来确定两个对象是否相同。 运行效率:hashcode的时间复杂度为O(1)(因为只要计算一次哈…

养老院管理系统基于springboot的养老院管理系统java项目

文章目录 养老院管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码(9.9¥带走) 养老院管理系统 一、项目演示 养老院管理系统 二、项目介绍 基于springboot的养老院管理系统 角色:超级…

Python-3.12.0文档解读-内置函数ord()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 详细说明 概述 语法 参数 返回值 示例 注意事项 应用场景 记忆策略 常用场景…

网易面试:手撕定时器

概述: 本文使用STL容器-set以及Linux提供的timerfd来实现定时器组件 所谓定时器就是管理大量定时任务,使其能按照超时时间有序地被执行 需求分析: 1.数据结构的选择:存储定时任务 2.驱动方式:如何选择一个任务并执…

微火问答:全域外卖和本地生活服务是同个项目吗?

当前,本地生活赛道火爆程度不断升级,作为其主要板块之一的团购外卖也持续迸发出新的活力。而全域运营的出现无疑是给团购外卖这把正在熊熊燃烧的烈火,又添了一把新柴! 所谓全域运营,简单来说,就是指所有领…

xjar加密springboot的jar包,并编译为执行程序

场景:当前项目需要进行jar包部署在windows环境和linux环境,并要求使用xjar加密。 1. xjar加密 源码程序自行搜索,这里只介绍加密及运行,运行加密程序,指定jar包,输入密码 2. 加密后的目录 3. go程序编译 …

HCIP-Datacom-ARST自选题库__BGP/MPLS IP VPN简答【3道题】

1.在BGP/MPLSIPVPN场景中,如果PE设备收到到达同一目的网络的多条路由时,将按照定的顺序选择最优路由。请将以下内容按照比较顺序进行排序。 2.在如图所示的BGP/MPLSIP VPN网络中,管理员准备通过Hub-Spoke组网实现H站点对VPM流量的集中管控&am…