惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
云风的 BLOG
云风的 BLOG
小众软件
小众软件
V
V2EX
博客园 - Franky
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
量子位
博客园 - 【当耐特】
雷峰网
雷峰网
WordPress大学
WordPress大学
Jina AI
Jina AI
Google DeepMind News
Google DeepMind News
N
Netflix TechBlog - Medium
爱范儿
爱范儿
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
Hugging Face - Blog
Hugging Face - Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
V
Visual Studio Blog
Microsoft Security Blog
Microsoft Security Blog

博客园 - 零一の世界

微信电脑版(WeChat)更改“WeChat Files”文件夹存储位置的方法 如何在Firefox中实现垂直标签页? 火狐浏览器垂直标签页设置方法! Office2024 LTSC 正式版 KMS激活(无需激活工具) 微信平台证书到期更换 VS 常用快捷键和使用技巧 -Visual Studio NLP vs. LLM:一篇帮你看清两者区别的简单指南 s7.net 写数据到plc_C#直接读写S7-200smartPLC的内存数据 Windows服务器系统日志提示:警告—系统—USER32—1076—无 十四年码农再出发:这次带着敬畏与好奇~ FineReprot提示错误:java.lang.IllegalStateException:The null Cache is not alive... About Links 如何让自己的exe程序开机自启动 如何在Windows安装达梦数据库(DM8) Oracle 报错:ORA-01438: 值大于为此列指定的允许精度 如何使用网易邮箱大师登录网易企业邮箱? PowerDesigner将PDM导出生成WORD文档(rtf文档) 如何快速从Github下载文件? VS2010打开项目 提示Asp.net4.0未在web服务器上注册的解决方案 Web 项目“RealEstate.Web”的 URL已配置为将 IIS 用作 Web 服务器,但是当前在 IIS Express Web 服务器上已配置URL C# 支付宝对账功能(查询+文件下载+解压+遍历文件+读文件)
SQL Server中如何实现区间随机数值函数的实现?
零一の世界 · 2021-01-25 · via 博客园 - 零一の世界

   工作中会遇到SQL Server模拟数据生成以及数值列值(如整型、日期和时间数据类型)随机填充等等任务,这些任务中都要使用到随机数。鉴于此,本文将对SQL Server中随机数的使用简单做个总结 。

T-SQL 随机有关的三个函数

    RAND([seed] 此函数生成从0到1之间随机 float 值(详细说明查看https://technet.microsoft.com/zh-cn/library/ms177610(v=sql.90).aspx)。

    CHECKSUM ( * | expression [ ,...n ] ) 此函数生成按照表的某一行或一组表达式计算出来的int校验和值,CHECKSUM 用于生成哈希索引(详细说明查看https://technet.microsoft.com/zh-cn/library/ms189788(v=sql.90).aspx)。

    NEWID ( ) 此函数生成 uniqueidentifier 类型的唯一值(详细说明查看https://technet.microsoft.com/zh-cn/library/ms190348(v=sql.90).aspx)。

生成任意一个随机数值(如整数、日期和时间数据类型)

    如果获得任意一个随机整数值?函数RAND生成的结果是float数据类型的,显然很难满足要求,不过可以通过对函数RAND的结果继续加工(比如其结果乘以某一个值保留整数部分等等)得到要求。很显然,函数CHECKSUM生成的结果是int数据类型,很容易满足我们的结果,不过其参数如果固定(表的某一行值相同或一组表达式值相同),那么其结果也是相同的。函数NEWID可以保证结果的唯一,但是其结果是unigueidentifer数据类型的。

    从以上三个函数的结果值分析:函数RNAD和CHECKSUM的结果是能获得整数数值的。如果我们将函数NEWID的结果值作为函数CHECKSUM的参数,那么其每次生成的结果值都是不一样的int数据类型的数值。以下T-SQL代码如下:

SELECT CHECKSUM(NEWID()) AS CheckSumValue, CHECKSUM(NEWID()) AS CheckSumValue2;

GO

执行后的查询结果如下:

 82100-20151221152011546-1083387472.png

    从上面的查询结果看到组合生成的整数数值都是9位数的,平时工作中大多使用的随机整数值都是不太大的且都是自然数(0和正整数的集合),这就要求限制随机生成的整数数值。可以使用函数ABS对其结果进行处理得到任意一个自然数。这样,组合一起来的格式就是这样的:ABS(CHECKSUM(NEWID()))。为了便于使用便于使用我们通过将其封装到函数中,但是函数NEWID又不能在函数中使用,那我们就要考虑其他的方式:将函数NEWID封装在单列单行的视图中。其定义视图的T-SQL代码如下:

SQL

IF OBJECT_ID(N'dbo.vRandomGuid', 'V') IS NOT NULL
BEGIN
    DROP VIEW dbo.vRandomGuid;
END
GO

--==================================
-- 功能: 随机Guid视图
-- 说明: 具体实现阐述
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
--==================================
CREATE VIEW dbo.vRandomGuid
    --$Encode$--
AS
    SELECT RandomGuid = NEWID();
GO

--调用该视图的T-SQL代码如
SELECT TOP 1 RandomGuid
FROM dbo.vRandomGuid;
GO

执行后的查询结果如下:

82100-20151221152023827-1033869727.png

生成整数区间内的任意一个随机整数

    上面的视图定义,我们继续讲解组合函数的进一步封装。我们先讲解如何限制随机生成的数值,取模运算可以实现生成在指定数值区间内的任意一个数值,例如:获取区间[3,5]内任意一个数字,我们设为区间的最小值为@intMin:3,最大值为@intMax,则该区间的间隔值为 @intMax - @intMin + 1: 5 - 3 + 1(3),那么针对任意的整数值设为为@intValue,然后对这个间隔值先进行取模运算在加上区间最小值,最后得到的值为: @intValue % (@intMax - @intMin + 1) + @intMin。如果@intValue为8,则结果值为5;如果@intValue为9,则结果值为3;如果@intValue为10,则结果值为4……

    针对以上的分析我们封装的T-SQL代码如下:

SQL

IF OBJECT_ID(N'dbo.ufn_RandNum', 'FN') IS NOT NULL
BEGIN
    DROP FUNCTION dbo.ufn_RandNum;
END
GO

--==================================
-- 功能: 获取区间内的任意一个随机数值
-- 说明: 具体实现阐述
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SELECT dbo.ufn_RandNum(0, 1);
--==================================
CREATE FUNCTION dbo.ufn_RandNum
(
    @intMin INT,            -- 随机数值的最小值
    @intMax INT                -- 随机数值的最大值
) RETURNS INT
    --$Encode$--
AS
BEGIN
    SET @intMin = ISNULL(@intMin, 0);
    SET @intMax = ISNULL(@intMax, 0);

    DECLARE @guidValue AS UNIQUEIDENTIFIER;

    SELECT TOP 1 @guidValue = RandomGuid
    FROM dbo.vRandomGuid;

    RETURN ABS(CHECKSUM(@guidValue)) % (@intMax - @intMin + 1) + @intMin;
END
GO

调用以上函数的T-SQL代码如下:

SQL

 SELECT dbo.ufn_RandNum(0, 1) AS RandNum, dbo.ufn_RandNum(10, 13) AS RandNum2 from dbo.HIS_Item

执行后的查询结果如下:

82100-20151221152039968-2106350012.png