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

news/2024/6/20 21:49:04/文章来源:https://blog.csdn.net/lmy_520/article/details/139258521

大家好,我是全栈小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.ldbm.cn/p/430308.html

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

相关文章

Rohm公司参展欧洲PCI盛会

​德国历史悠久的文化名城纽伦堡,即将迎来一场科技盛宴——欧洲PCI展览会。在这个为期三天的盛会中(6月11日至13日),Rohm公司将以璀璨之姿,特别聚焦宽带隙(WBG)设备的璀璨光芒。 此次&#xff0…

AWS安全性身份和合规性之Identity and Access Management(IAM)

通过AWS Identity and Access Management(IAM),您可以指定谁或什么能够访问AWS中的服务和资源、集中管理精细权限,并分析访问权限以优化跨AWS的权限。 比如一家软件开发公司需要在AWS上创建多个开发人员账户,并对其进…

Kibana创建ElasticSearch 用户角色

文章目录 1, ES 权限参考2, 某应用的管理员权限:可以open/close/delete/cat/read/write 索引3, 某应用的读写权限:可以cat/read/write 索引 (不能删除索引或数据)4, 某应用的只读权限 1, ES 权限参考 https://www.elastic.co/gui…

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

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

K8S中Prometheus+Grafana监控

1.介绍 phometheus:当前一套非常流行的开源监控和报警系统。 运行原理:通过HTTP协议周期性抓取被监控组件的状态。输出被监控组件信息的HTTP接口称为exporter。 常用组件大部分都有exporter可以直接使用,比如haproxy,nginx,Mysql,Linux系统信…

目标检测基础初步学习

目标检测(Object Detection) 目标检测任务说明 在动手学习深度学习中对目标检测任务有如下的描述。 图像分类任务中,我们假设图像中只有一个主要物体对象,我们只关注如何识别其类别。 然而,很多时候图像里有多个我们…

JavaScrip原型对象

参考 JavaScrip原型对象 | LogDicthttps://www.logdict.com/archives/javascripyuan-xing-mo-shi

HTML5和CSS3的新特性

文章目录 一、HTML5新特性1.HTML5新增的语义化标签2.HTML5新增的多媒体标签3.HTML5新增的input类型4.HTML5新增表单属性 二、CSS3的新特性1.属性选择器2.结构伪类选择器3.伪元素选择器4.CSS3盒子模型5.过渡 一、HTML5新特性 1.HTML5新增的语义化标签 2.HTML5新增的多媒体标签 …

如何成为一名合格的JAVA程序员?

如何成为一名称职的Java编程人员?你一定不能错过的两本书。 第一本《Java核心技术速学版(第3版)》! 1.经典Java作品《Java核心技术》的速学版本,降低学习门槛,帮助读者更容易学习Java,更快地把…

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

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

Firefox浏览器网页上的按钮点击无效解决办法

我在github下点下载经常不好使,查了原因,原来是浏览器的问题。在Firefox浏览器的设置里面,去掉一些cookies的禁用即可。之后,就可以点击按钮成功响应了。

【Game】Powerful

文章目录 【小伙伴】隐藏小伙伴 【百趣集】【人物属性点】【宠物打造】【奇遇】【钓鱼】 【小伙伴】 刷新位置 小伙伴等级详情 克制关系 隐藏小伙伴 1、仙缘小伙伴(6种) 遇到仙缘驭宠师然后进入战斗抓取 107、七彩仙凤 108、小青兔 109、小布 110、黑腹蛛…

[IMX6ULL驱动开发]-Linux对中断的处理(二)

上一篇文章中,引入了Linux对于中断的一些简略流程以及中断抽象为具体实际形象。此文章主要是继续加深对Linux对中断的处理流程以及一些相应的数据结构。 目录 Linux对中断的扩展:硬件中断、软件中断 多中断处理 中断上下部处理流程 发生中断A&#…

前端路由 Hash 模式和 History 模式

在SPA单页面模式盛行,前后端分离的背景下,我们要弄清楚路由到底是个什么玩意,它可以帮助我们加深对于前端项目线上运作的理解。 而现在我们常见的路由实现方式,主要有两种,分别是history和hash模式。 理解 如何理解路…

Vue中使用Vue-scroll做表格使得在x轴滑动

页面效果 首先 npm i vuescroll 在main.js中挂载到全局 页面代码 <template><div class"app-container"><Header :titletitle gobackgoBack><template v-slot:icon><van-icon clickgoHome classicon namewap-home-o /></templat…

React18 apexcharts数据可视化之甜甜圈图

03 甜甜圈图 apexcharts数据可视化之甜甜圈图。 有完整配套的Python后端代码。 本教程主要会介绍如下图形绘制方式&#xff1a; 基本甜甜圈图个性图案的甜甜圈图渐变色的甜甜圈图 面包圈 import ApexChart from react-apexcharts;export function DonutUpdate() {// 数据…

信息标记形式 (XML, JSON, YAML)

文章目录 &#x1f5a5;️介绍&#x1f5a5;️三种形式&#x1f3f7;️XML (Extensible Markup Language)&#x1f516;规范&#x1f516;注释&#x1f516;举例&#x1f516;其他 &#x1f3f7;️JSON (JavaScript Object Notation)&#x1f516;规范&#x1f516;注释&#x…

Hexo最新实战:(一)Hexo7.0+GitHub Pages博客搭建

前言 很多平台都能写博客还有创作激励&#xff0c;为什么我又要搭一个&#xff1f;为什么这次要选择用Hexo框架&#xff1f; 对应的原因是流量自由和省钱&#xff0c;第一个&#xff0c;很多平台能写但不是都有收益&#xff0c;而且平台有自身的规则&#xff0c;比如会屏蔽一…

关于在子线程中获取不到HttpServletRequest对象的问题

这篇文章主要分享一下项目里遇到的获取request对象为null的问题&#xff0c;具体是在登录的时候触发的邮箱提醒&#xff0c;获取客户端ip地址&#xff0c;然后通过ip地址定位获取定位信息&#xff0c;从而提示账号在哪里登录。 但是登录却发现获取request对象的时候报错了。 具…

Linux线程:管理与控制

一、引言 随着计算机硬件技术的飞速发展&#xff0c;尤其是多核CPU的普及&#xff0c;多线程编程已成为充分利用系统资源、提高程序并发性和响应速度的关键技术。 多线程编程允许一个程序中同时运行多个线程&#xff0c;每个线程可以独立地执行不同的任务。这种并行处理的方式…