首先,sqlserver里提供了随机函数rand,但这东西是个大坑,每次单独使用没问题,但是在一个查询中出现多行结果时,这就是个坑了,因为rand的优先级比查询指令高!所以,结果就会如下图这样了

然后,老顾想自己写个随机函数,使用rand和newid来结合,产生一个float值,结果,函数没办法写,sqlserver报错了

消息 443,级别 16,状态 1,过程 rnd,行 13 [批起始行 15]
在函数内对带副作用的运算符 ‘newid’ 的使用无效。
消息 443,级别 16,状态 1,过程 rnd,行 25 [批起始行 15]
在函数内对带副作用的运算符 ‘rand’ 的使用无效。


原因还是一样的,sqlserver中,不能存在不确定的值,1就是1,2就是2,你给我个不确定函数得到的内容,sqlserver不给承认~~

但是没关系,不能直接用rand,但用cross结合newid和rand,一样来实现随机值


select number,rnd.*
from master..spt_values
cross apply(select rnd from (select convert(varchar(50),newid()) guid) across apply (select rand(convert(bigint,convert(varbinary,cast(N'0x' + substring(guid,0,charindex('-',guid)) as char),1))%2147483647) rnd) b
) rnd
where type='p'


思路也很简单,使用newid生成一个序列值,并取第一个减号前的内容转成10进制数字作为rand的种子,得到随机数

需要注意各个类型转换不能缺少,newid()得到的类型是uniqueidentifier,不能使用字符串处理函数,需要先转成字符串才能截取减号前的内容

另外就是,转成十进制数字时,有时会超出int的取值范围,所以,我在这里用取余来得到一个确定的int类型的值,毕竟rand函数不支持bigint作为参数

那么,既然可以实现了各行的随机值不相同了,那么,咱们就用一个模拟需求来看看效果如何

先描述一下需求:

对0到2047这2000多个数字进行随机分布,分布到连续的30天中,早8点至晚10点的时间段内

因为有两个分布内容,一个是日期段,一个是时间段,所以我们使用两个cross来取两个随机数


select number,日期.*,时间.*
from master..spt_values
cross apply(select rnd from (select convert(varchar(50),newid()) guid) across apply (select rand(convert(bigint,convert(varbinary,cast(N'0x' + substring(guid,0,charindex('-',guid)) as char),1))%2147483647) rnd) b
) 日期
cross apply(select rnd from (select convert(varchar(50),newid()) guid) across apply (select rand(convert(bigint,convert(varbinary,cast(N'0x' + substring(guid,0,charindex('-',guid)) as char),1))%2147483647) rnd) b
) 时间
where type='p'


根据两个随机数,然后用dateadd来运算出日期和时间


select number,日期.*,时间.*,x.*
from master..spt_values
cross apply(select rnd from (select convert(varchar(50),newid()) guid) across apply (select rand(convert(bigint,convert(varbinary,cast(N'0x' + substring(guid,0,charindex('-',guid)) as char),1))%2147483647) rnd) b
) 日期
cross apply(select rnd from (select convert(varchar(50),newid()) guid) across apply (select rand(convert(bigint,convert(varbinary,cast(N'0x' + substring(guid,0,charindex('-',guid)) as char),1))%2147483647) rnd) b
) 时间
cross apply (select dateadd(second,时间.rnd*60*60*13,dateadd(hour,8,dateadd(d,floor(日期.rnd*31),'2022-7-29'))) d
) x
where type='p'
order by d


通过这个简单的示例,我们可以将任意多的数据作出随机分布出来,通过命令,也可以直接伪造一些点击、访问或注册数据出来了

由于上边这个写法太复杂了,所以做一个newid到rand之间的中间函数

Create FUNCTION [dbo].[GuidToInt]
(@guid uniqueidentifier
)
RETURNS int
AS
BEGINDECLARE @r int,@s varchar(50)select @s = convert(varchar(50),@guid)select @r = convert(bigint,convert(varbinary,cast(N'0x' + substring(@s,0,charindex('-',@s)) as char),1))%2147483647RETURN @rEND

然后,我们的指令就可以变形一下了

select number,日期.*,x.*
from master..spt_values
cross apply(select rand(master.dbo.GuidToInt(newid())) rnd1,rand(master.dbo.GuidToInt(newid())) rnd2
) 日期
cross apply (select dateadd(ms,rnd1*60*60*13000,dateadd(hour,8,dateadd(d,floor(rnd2*31),'2022-7-29'))) d
) x
where type='p'
order by d


这样就可以很方便的对多行数据进行随机数实施了。


写完之后,才发现,还有一个checksum 函数,用来计算校验和,可以用作中间函数,即

select rand(checksum(newid())) --即可得到适用的随机数了

现在号尴尬啊。。。。

Sql 语句小课堂7:在sqlserver对多行数据实施随机数相关推荐

  1. 查询oracle 表达小,oracle中sql语句小练习(使用连接查询)

    假设A(m,n,p),B(m,n,p) --1.A表中有某一项m而B表中没有 使用左连接查询: select a.* from A a left join B b on a.m=b.m where b ...

  2. sql--sqlsever--时间相关SQL语句--查询当前时间至前N天的数据

    sql–sqlsever–时间相关SQL语句–查询当前时间至前N天的数据 . . . sql server:取当前时间前10分钟之内的数据 dateadd() 当前时间 select GETDATE( ...

  3. sqlserver函数多行数据合并成一行

    sqlserver函数多行数据合并成一行 SELECTusername,coursename= (STUFF((SELECT ',' + coursenameFROM t_user_courseWHE ...

  4. 使用 SQL 语句从数据库一个表中随机获取一些数据

    以前从一个表中随机获取数据的时候,都是先把数据读取到来, 然后再在程序中来随机抽取一部分数据, 今天告诉大家一种使用 SQL 语句的方法来随机获取一部分数据 SQL Server: -- 随机获取 1 ...

  5. 数据库SQL语句学习笔记(6)-使用函数处理数据

    1.SQL也可以用函数来处理数据,函数一般是在数据上执行的,为数据的转换和处理提供了方便.但是每一个数据库管理系统(DBMS)都有特定的函数,事实上,只有少数几个函数被所有的DBMS等同地支持.例如, ...

  6. 数据库创建(利用写好的数据库表生成创建表的sql语句+利用生成的数据库创建表加同步数据sql)

    一.利用写好的数据库表生成创建表的sql语句 1.简单创建一个数据库,并建一个表,并编辑数据. a.建库 b.建表 c.编辑表,保存时输入表名 d.刷新一下,出来了 e.转存导出sql文件. 二.利用 ...

  7. oracle同时运行多行sql语句,.NET程序连接Oracle一次执行多行SQL的注意事项

    以前写的基于MSSQL数据库的.NET程序,不用担心SQL语句中的;或者换行符.但是因为要基于Infor LN的Oracle数据库进行开发,就碰到了;分号和换行的报错,同时一次执行UPDATE的多条更 ...

  8. MYSQL——数据库sql语句小练习(1)

    现在有一教学管理系统,具体的关系模式如下: Student (no, name, sex, birthday, class) Teacher (no, name, sex, birthday, pro ...

  9. SQL语句小tips(持续更新)

    统计非法数据 判断people_id是否是32为字母组成的,统计不满足要求的数据 SELECT COUNT(IF(BINARY people_id NOT REGEXP '^[0-9a-z]{32}' ...

最新文章

  1. 计算机书籍-实用Python机器学习预测分析
  2. 企业建立规范化IT运维管理制度的重要性
  3. C# 遇到 which has a higher version than referenced assembly
  4. 计算机语言学 自然语言处理程序,利用知网进行(计算机)自然语言处理
  5. Android获取屏幕实际高度跟显示高度,判断Android设备是否拥有虚拟功能键
  6. 为什么有人很容易的考上公务员?有的人考了三年都考不上?
  7. 小程序input聚焦事件_微信小程序input失焦异常
  8. word里双横线怎么打_Word中下划线怎么打出来
  9. Python的7大就业方向,转行的人适合哪个方向?学了Python能干什么?
  10. Spring Security 使用
  11. Mockplus组件样式库一键解决风格复用
  12. fbreader android源码分析,开源阅读器FBReader Android版本的编译
  13. ppt如何替换其他mo ban_有没有一个 PPT 技巧让自己觉得人生都亮了?
  14. mysql大翻页limt 1700,100慢优化方案
  15. oracle connectionstring 属性尚未初始化.,ConnectionString 属性尚未初始化
  16. GIONEE A1 金立A1 root 刷机包 GIONEE SWW1609_0201 mt6755
  17. 讯飞语音api 文字转语音生成MP3遇到的bug
  18. 职业学校计算机专业总结,职业学校期末总结范文
  19. 关于速度与时间的关系
  20. 社区团购小程序需要服务器吗,为什么说社区团购小程序和团购电商模式结合很有必要!...

热门文章

  1. OPC基本知识介绍——什么是OPC
  2. vue实现v-chart绑定数据
  3. android无限轮播banner图片并且解决banner图片只有2张出现白板的情况,触摸即不轮播
  4. 激励反向传播的自上而下注意力神经模型
  5. sql语句重点基础:查询语句
  6. PythonStock(33)特别的巧,发现一个使用 vue 开发的股票系统应用,具备了一些基础的功能,可以拿过来直接跑起来。使用dockerfile进行构建,并跑起来
  7. 【入门】Pytorch实现简单的图片分类器
  8. python numpy是什么_Python库Numpy里ndarray.ndim 是什么意思?
  9. matlab 正负数,matlab判断函数值正负程序
  10. python 定时运行 定时关闭_Python脚本用于定时关闭网易云音乐PC客户端