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

大家好,我是全栈小5,欢迎来到《小5讲堂》。

这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解。

温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!

目录

前言

温故而知新,最近在写sql查询语句,需求是随机查询表的其中一条记录。

基于这个查询,顺便把数据库自定义函数、存储过程这个两个知识点重温固定下。

因此,本篇文章将在随机查询一条表记录的基础上,把sql语句封装到函数和存储过程里。

随机查询语句

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

例如:

python 复制代码
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 中,函数的基本格式如下:

python 复制代码
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)

标量函数接受零个或多个参数,并返回单个值。

python 复制代码
-- 创建标量函数

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)

内联表值函数可以直接在查询中使用。

python 复制代码
-- 创建内联表值函数

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 语句返回结果集。

python 复制代码
-- 创建多语句表值函数

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' 的使用无效。

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

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

相关推荐
PGCCC13 分钟前
【PGCCC】Postgresql 存储设计
数据库·postgresql
PcVue China2 小时前
PcVue + SQL Grid : 释放数据的无限潜力
大数据·服务器·数据库·sql·科技·安全·oracle
魔道不误砍柴功4 小时前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
锐策4 小时前
〔 MySQL 〕数据库基础
数据库·mysql
远歌已逝5 小时前
管理Oracle实例(二)
数据库·oracle
日月星宿~5 小时前
【MySQL】summary
数据库·mysql
爱吃土豆的程序员5 小时前
在oracle官网下载资源显示400 Bad Request Request Header Or Cookie Too Large 解决办法
java·数据库·oracle·cookie
睿思达DBA_WGX6 小时前
Oracle 11g rac 集群节点的修复过程
数据库·oracle
尘浮生6 小时前
Java项目实战II基于微信小程序的移动学习平台的设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·学习·微信小程序·小程序
Leo.yuan7 小时前
数据量大Excel卡顿严重?选对报表工具提高10倍效率
数据库·数据分析·数据可视化·powerbi