SqlServer生成连续数字根据指定的数字操作(SqlServer生成连续数字根据指定的数字操作)
SqlServer生成连续数字根据指定的数字操作
SqlServer生成连续数字根据指定的数字操作需求是使用sqlserver根据指定的数字和表生成一串连续的数字,类似于oracle中ROWNUM的功能,具体实现如下:
一、Oracle使用ROWNUM实现方式
SELECT ROWNUM number_list FROM 表名 WHERE ROWNUM <= 10;
二、SqlServer实现上述功能的三种方式
1.使用MASTER…spt_values方式
SELECT number FROM MASTER..spt_values WHERE TYPE = 'P' AND number > 0 AND number <= 10;
spt_values是master数据库中的一张系统表,number的数值范围是0~2047
2.使用String_Split函数实现
select row_number() over (order by (select 1)) from String_Split(space(6),' ')
String_Split是SQLServer 2016的新函数,这个方法只对2016及后续版本有效。
(我的数据库版本是2008,此方式未验证)
3.使用top+ROW_NUMBER () OVER方式实现
SELECT TOP 10 ROW_NUMBER () OVER ( ORDER BY (SELECT 1)) number_list FROM (SELECT TOP 10 * FROM 表名) t;
第一种方式对数据库版本无要求,但是取值范围有限制0~2047;
第二种方式对数据库版本有要求,要在2016及之上;
第三种方式对数据库版本无要求,只要表里的数据量大于要生成的数字即可;
补充知识:数据库生成测试数据(SQL实现)
需求
项目中偶尔会有造数据进行测试的情况,根据常见的数据特征,我这里假设数据某表Table_X含4个字段,每个字段的要求如下,需要造出5000条数据。
以上需求看上去非常简单,但比较具有代表性,复杂需求也是由小需求排列组合而成。
功能准备
随机数
造数的核心功能是生成随机数,SQL Server下有RAND()系统函数可以生成0到1之间的小数,利用它可以生成固定区间 [Min,Max] 的小数:Min + (Max - Min) * RAND(),另外CHECKSUM(NEWID())也可以生成一串比较大的整数(9位或10位数居多),再配合ABS取绝对值和取模运算,就可以很好的控制所生成随机数的范围了。
区间随机数函数
为了SQL写起来方便,可事先创建一个自定义函数,用来生成区间随机数:
CREATE VIEW vwRand AS SELECT RAND() AS RandValue GO CREATE FUNCTION dbo.Random_Range ( @Min DECIMAL(22,5) ,@Max DECIMAL(22,5) )RETURNS DECIMAL(22,5) -- return value between @Min and @Max BEGIN DECLARE @Result DECIMAL(22,5); SELECT @Result = @Min + (@Max - @Min) * RandValue FROM vwRand; RETURN @Result END GO
这里先创建了一个视图,然后在函数体内引用,是因为SQL Server不支持直接在函数体中引用RAND函数,会报错Invalid use of a side-effecting operator ‘rand' within a function.。
列表选择
如果是从少量的枚举数值中选择,可以使用CHOOSE函数。
若从大量候选项中选择,可将数据导入含自增列的数据库表后,通过标量子查询进行选择。
造数SQL
SELECT TOP 5000 ABS(CHECKSUM(NEWID())) % 100 + 1 AS Col_A ,dbo.Random_Range(5000, 10000) AS Col_B ,ISNULL(CHOOSE(ABS(CHECKSUM(NEWID())) % 3 + 1, 'S', 'M', 'L', 'XL', 'XXL'), 'M') AS Col_C ,DATEADD(DAY, dbo.Random_Range(0, DATEDIFF(DAY, '20000101', '20201231')), '20000101') AS Col_D FROM sys.all_columns
说明
实际需求可能字段非常多,但基本都可以用以上写法,修改参数即可;
SQL的功能毕竟有限,基本只适合从固定列表中随机选择,以及生成随机数值性数据的场景;
若要造出更符合业务领域特性的数据,比如批量生成城市名、邮箱、人名、手机号、地址等数据,用纯SQL就会有点吃力了,下一篇将介绍如何用python的faker库生成测试数据。
以上这篇SqlServer生成连续数字根据指定的数字操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持开心学习网。
- sqlserver怎么修改表结构(SQL Server中修改“用户自定义表类型”问题的分析与方法)
- 详解SqlServer数据库中Substring函数的用法(详解SqlServer数据库中Substring函数的用法)
- sqlserver 多实例怎么算许可(SQL Server使用row_number分页的实现方法)
- SqlServer类似正则表达式的字符处理问题(SqlServer类似正则表达式的字符处理问题)
- sqlserverdate格式比较(sqlserver之datepart和datediff应用查找当天上午和下午的数据)
- mysqlsql按日期统计(sqlserver/mysql按天、按小时、按分钟统计连续时间段数据推荐)
- SQLserver中cube:多维数据集实例详解(SQLserver中cube:多维数据集实例详解)
- sqlserver两表查询语句格式(sql server实现在多个数据库间快速查询某个表信息的方法)
- sqlserver怎么写判断条件(SQL Server之SELECT INTO 和 INSERT INTO SELECT案例详解)
- sqlserver删除表的第一行数据(sql server删除前1000行数据的方法实例)
- sqlserver2008数据库的备份(sql server 2008 压缩备份数据库20g)
- sqlservercount函数的用法(SQL Server中row_number函数的常见用法示例详解)
- sqlserver表空间占用率(SQL Server获取磁盘空间使用情况)
- sql中去除重复记录的关键字(sqlserver查询去掉重复数据的实现)
- sqlserver如何添加数据库(sqlserver建立新用户及关联数据库教程)
- sqlserver修改排序规则几种方法(SQL Server 分页编号的另一种方式推荐)
- 老弄堂里的市井味道(老弄堂里的市井味道)
- 小米音乐可绑定QQ音乐, QQ音乐 真的会消失在小米的设备上吗(小米音乐可绑定QQ音乐)
- 小米Watch S1评测 或许能成为小米冲击高端可穿戴设备的里程碑(小米WatchS1评测或许能成为小米冲击高端可穿戴设备的里程碑)
- 手机QQ与小米路由器在一起 明天揭晓,敬请期待(手机QQ与小米路由器在一起)
- 小米音乐与 QQ 音乐合作,便捷迁移会员(小米音乐与QQ音乐合作)
- 小米推出米兔儿童电话手表奥特曼版,799 元,支持微信 QQ(小米推出米兔儿童电话手表奥特曼版)
热门推荐
- css before和after(CSS中灵活使用:before和:after)
- html5文档的基本结构及必要的注释(关于HTML5+ API plusready的兼容问题)
- linux基础教程磁盘配额的设计(WDCP Linux服务器磁盘爆满的处理方法)
- tomcat与eclipse配置运行(Tomcat配置及如何在Eclipse中启动)
- nginxrewrite有什么功能(Nginx Rewrite使用场景及代码案例详解)
- laravel5.5以下自定义日志(Laravel timestamps 设置为unix时间戳的方法)
- thinkphp使用说明(thinkphp框架使用JWTtoken的方法详解)
- httpcontextbase 与 httpcontext
- 云ecs服务器怎么释放(如何解决阿里云ECS Windows服务器C盘权限被删除导致无法访问)
- python编写计算机病毒教程(Python告诉你木马程序的键盘记录原理)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9