【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
BEGIN
    DECLARE @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, EmployeeName
    FROM Employees
    WHERE 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
BEGIN
    INSERT INTO @Employees (EmployeeID, EmployeeName, Salary)
    SELECT EmployeeID, EmployeeName, Salary
    FROM Employees
    WHERE 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
begin
    declare @my_name nvarchar(50)
    select top 1 @my_name=nameValue
    from(
        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 all
        select 5 as id,'张三55' as nameValue union all select 6 as id,'张三66' as name union all
        select 7 as id,'张三77' as nameValue union all select 8 as id,'张三88' as name
    ) a
    where id=1
    --order by CHECKSUM(@newid)
    --print(@my_name)

    return @my_name
end

select 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】新手一分钟看懂在已有表基础上修改字段默认值和数据类型

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

56. UE5 RPG 给敌人添加AI实现跟随玩家

在这一篇里,我们要实现一下敌人的AI,敌人也需要一系列的行为,比如朝向英雄攻击,移动,在满足条件时施放技能。这些敌人的行为可以通过使用UE的内置的AI系统去实现。 在UE里,只要是基于Character类创建的蓝图…

螺旋矩阵(算法题)

文章目录 螺旋矩阵解题思路 螺旋矩阵 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,5]]解题思路 模…

YOLOv8+PyQt5动物检测系统完整资源集合(yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)

1.猫狗猴检测YOLOv8(https://mbd.pub/o/bread/mbd-ZpaTl51u)_哔哩哔哩_bilibili 资源包含可视化的动物检测系统,基于最新的YOLOv8训练的动物检测模型,和基于PyQt5制作的可视化动物检测系统,包含登陆页面、注册页面和检…

Java---Cloneable接口---浅克隆和深克隆

在Java中,我们如何实现一个对象的克隆呢? 在Java中实现对象的克隆,我们要用到Cloneable接口。克隆也分为浅克隆和深克隆。 1.实现浅克隆 1.重写clone方法 当我们想直接通过前面已经建立好的对象来调用Object类中的clone方法时,…

摸鱼大数据——Hive表操作——分区表

1、介绍 特点: 分区表会在HDFS上产生目录。查询数据的时候使用分区字段筛选数据,可以避免全表扫描,从而提升查询效率 注意: 如果是分区表,在查询数据的时候,如果没有使用分区字段,它回去进行全表扫描,会降低…

positivessl泛域名证书500元13个月

随着创建网站的门槛变低,不论是个人用户还是企事业单位用户创建的域名网站也越来越多,怎么维护网络环境的安全成为了各个用户需要解决的问题。为了保护网站的数据安全,防止恶意攻击和数据泄露,大多数用户选择为域名网站安装数字证…

Laravel 图片添加水印

和这个配合使用 Laravel ThinkPhP 海报生成_laravel 制作海报-CSDN博客 代码 //水印 $x_length $imageInfo[0]; $y_length $imageInfo[1];$color imagecolorallocatealpha($posterImage, 255, 255, 255, 70); // 增加透明度参数alpha$font_size 40; //字体大小 $angle …

YOLOv10涨点改进:如何魔改注意力进行二次创新,高效替换PSA | NEU-DET为案列进行展开

💡💡💡本文改进:替换YOLOv10中的PSA进行二次创新,1)EMA替换 PSA中的多头自注意力模块MHSA注意力;2) EMA直接替换 PSA; 在NEU-DET案列进行可行性验证,1&#x…

WebGIS 智慧城市三维可视化综合管控

智慧城市可视化建设不仅提升了城市管理的科技含量和效率,还促进了城市可持续发展,提升了居民的生活质量。随着技术的不断发展和应用,智慧城市可视化建设将会更加丰富和完善,为城市发展带来更加广阔的前景。 图扑应用自研 HT for W…

Linux一键安装Docker、kkfileviewer

Linux一键安装Docker、kkfileviewer 一、安装docker 安装docker脚本 vi initDocker.sh脚本内容 #安装前先更新yum,防止连接镜像失败 yum -y update#卸载系统之前的docker(可选择,我这里直接注释了) #yum remove docker docker…

mybatis新增到数据库后返回当前ID

描述 在开发中,插入一条数据并返回当前的ID的场景很多 之前用mybatisPlus自带的api非常简单,调用完save or insert之后再getId即可。 今天使用mybatis的时候也遇到了这个场景,在此记录一下。 解决问题 直接再insert标签里面表明属性 核心…

数据挖掘与机器学习——回归分析

目录 回归分析定义: 案例: 线性回归 预备知识: 定义: 一元线性回归: 如何找出最佳的一元线性回归模型: 案例: python实现: 多元线性回归 案例: 线性回归的优缺…

抖店重磅新规!保证金下调,一张营业执照能开多个店铺了!

哈喽~我是月月 抖音平台为助力小商家实现开店低成本,轻负担,高收益的模式 在5月30日正式实施了两个政策:保证金下调,一证多开 政策一:保证金下调 这次政策,涉及的类目优惠包含了,平台近70%的…

假暴力,cf1168B. Good Triple

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1168B - Codeforces 二、解题报告 1、思路分析 一眼没思路&#xff0c;打个暴力试试 因为如果 s[l, r] 是一个好字符串&#xff0c;那么s[i, r]一定也是好字符串&#xff0c;其中i < l 那么…

【Mongo】索引结构

结论 Mongo3.2版本开始&#xff0c;索引的结构默认是B树。 起因 面试的时候&#xff0c;面试官问为什么Mongo DB底层使用B树而不是B树&#xff1f; 面试完赶紧恶补&#xff0c;结果发现面试官好像给我埋了个坑。。。 MongoDB官方描述&#xff1a; 翻译一下就是&#xff1…

Java 类加载机制解密一探到底

类加载是 Java 程序在运行期执行之前的重要环节&#xff0c;它决定着程序的运行效率和稳定性。本文将为您深入剖析 Java 类加载机制的整个生命周期&#xff0c;揭开神秘面纱&#xff0c;让您彻底掌握这一核心知识点。 一、类的生命周期概述 类的生命周期在Java中指的是从类被加…

【全开源】CMS内容管理系统源码(ThinkPHP+FastAdmin)

基于ThinkPHPFastAdmin的CMS内容管理系统&#xff0c;自定义内容模型、自定义单页、自定义表单、专题、统计报表、会员发布等 提供全部前后台无加密源代码和数据库私有化部署&#xff0c;UniAPP版本提供全部无加密UniAPP源码。 ​构建高效内容管理的基石 一、引言&#xff1a…

数据结构—队列(C语言实现)

文章目录 前言一、队列的概念二、队列的实现Queue.hQueue.c 三、设计循环队列问题数组实现链表实现 总结 前言 嗨喽喽&#xff01;&#xff01;小伙伴们&#xff0c;大家好哇&#xff0c;欢迎来到我的博客&#xff01; 今天将要分享的是另一种数据结构—队列&#xff0c;以及…

迈向F5G-A,开启全光万兆新时代——南通移动完成全市首个50G-PON技术验证

近日&#xff0c;南通移动在崇川区完成全市首个50G-PON万兆技术现网验证&#xff0c;标志着南通成为首批具备F5G-A(The 5th GenerationFixed Network-advanced)的万兆光网城市&#xff0c;使其成为网速最快、覆盖最全、时延最低的城市之一。 作为全光万兆的关键技术&#xff0c…