Sql 语句小课堂7:在sqlserver对多行数据实施随机数
首先,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对多行数据实施随机数相关推荐
- 查询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 ...
- sql--sqlsever--时间相关SQL语句--查询当前时间至前N天的数据
sql–sqlsever–时间相关SQL语句–查询当前时间至前N天的数据 . . . sql server:取当前时间前10分钟之内的数据 dateadd() 当前时间 select GETDATE( ...
- sqlserver函数多行数据合并成一行
sqlserver函数多行数据合并成一行 SELECTusername,coursename= (STUFF((SELECT ',' + coursenameFROM t_user_courseWHE ...
- 使用 SQL 语句从数据库一个表中随机获取一些数据
以前从一个表中随机获取数据的时候,都是先把数据读取到来, 然后再在程序中来随机抽取一部分数据, 今天告诉大家一种使用 SQL 语句的方法来随机获取一部分数据 SQL Server: -- 随机获取 1 ...
- 数据库SQL语句学习笔记(6)-使用函数处理数据
1.SQL也可以用函数来处理数据,函数一般是在数据上执行的,为数据的转换和处理提供了方便.但是每一个数据库管理系统(DBMS)都有特定的函数,事实上,只有少数几个函数被所有的DBMS等同地支持.例如, ...
- 数据库创建(利用写好的数据库表生成创建表的sql语句+利用生成的数据库创建表加同步数据sql)
一.利用写好的数据库表生成创建表的sql语句 1.简单创建一个数据库,并建一个表,并编辑数据. a.建库 b.建表 c.编辑表,保存时输入表名 d.刷新一下,出来了 e.转存导出sql文件. 二.利用 ...
- oracle同时运行多行sql语句,.NET程序连接Oracle一次执行多行SQL的注意事项
以前写的基于MSSQL数据库的.NET程序,不用担心SQL语句中的;或者换行符.但是因为要基于Infor LN的Oracle数据库进行开发,就碰到了;分号和换行的报错,同时一次执行UPDATE的多条更 ...
- MYSQL——数据库sql语句小练习(1)
现在有一教学管理系统,具体的关系模式如下: Student (no, name, sex, birthday, class) Teacher (no, name, sex, birthday, pro ...
- SQL语句小tips(持续更新)
统计非法数据 判断people_id是否是32为字母组成的,统计不满足要求的数据 SELECT COUNT(IF(BINARY people_id NOT REGEXP '^[0-9a-z]{32}' ...
最新文章
- 计算机书籍-实用Python机器学习预测分析
- 企业建立规范化IT运维管理制度的重要性
- C# 遇到 which has a higher version than referenced assembly
- 计算机语言学 自然语言处理程序,利用知网进行(计算机)自然语言处理
- Android获取屏幕实际高度跟显示高度,判断Android设备是否拥有虚拟功能键
- 为什么有人很容易的考上公务员?有的人考了三年都考不上?
- 小程序input聚焦事件_微信小程序input失焦异常
- word里双横线怎么打_Word中下划线怎么打出来
- Python的7大就业方向,转行的人适合哪个方向?学了Python能干什么?
- Spring Security 使用
- Mockplus组件样式库一键解决风格复用
- fbreader android源码分析,开源阅读器FBReader Android版本的编译
- ppt如何替换其他mo ban_有没有一个 PPT 技巧让自己觉得人生都亮了?
- mysql大翻页limt 1700,100慢优化方案
- oracle connectionstring 属性尚未初始化.,ConnectionString 属性尚未初始化
- GIONEE A1 金立A1 root 刷机包 GIONEE SWW1609_0201 mt6755
- 讯飞语音api 文字转语音生成MP3遇到的bug
- 职业学校计算机专业总结,职业学校期末总结范文
- 关于速度与时间的关系
- 社区团购小程序需要服务器吗,为什么说社区团购小程序和团购电商模式结合很有必要!...
热门文章
- OPC基本知识介绍——什么是OPC
- vue实现v-chart绑定数据
- android无限轮播banner图片并且解决banner图片只有2张出现白板的情况,触摸即不轮播
- 激励反向传播的自上而下注意力神经模型
- sql语句重点基础:查询语句
- PythonStock(33)特别的巧,发现一个使用 vue 开发的股票系统应用,具备了一些基础的功能,可以拿过来直接跑起来。使用dockerfile进行构建,并跑起来
- 【入门】Pytorch实现简单的图片分类器
- python numpy是什么_Python库Numpy里ndarray.ndim 是什么意思?
- matlab 正负数,matlab判断函数值正负程序
- python 定时运行 定时关闭_Python脚本用于定时关闭网易云音乐PC客户端