大家好,我是全栈小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】新手一分钟看懂在已有表基础上修改字段默认值和数据类型
总结:温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。