SqlServer生成连续数字根据指定的数字操作

需求是使用sqlserver根据指定的数字和表生成一串连续的数字,类似于oracle中rownum的功能,具体实现如下:

一、oracle使用rownum实现方式

二、sqlserver实现上述功能的三种方式

1.使用master…spt_values方式

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方式实现

第一种方式对数据库版本无要求,但是取值范围有限制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写起来方便,可事先创建一个自定义函数,用来生成区间随机数:

这里先创建了一个视图,然后在函数体内引用,是因为sql server不支持直接在函数体中引用rand函数,会报错invalid use of a side-effecting operator ‘rand’ within a function.。

列表选择

如果是从少量的枚举数值中选择,可以使用choose函数。

若从大量候选项中选择,可将数据导入含自增列的数据库表后,通过标量子查询进行选择。

造数sql

说明

实际需求可能字段非常多,但基本都可以用以上写法,修改参数即可;

sql的功能毕竟有限,基本只适合从固定列表中随机选择,以及生成随机数值性数据的场景;

若要造出更符合业务领域特性的数据,比如批量生成城市名、邮箱、人名、手机号、地址等数据,用纯sql就会有点吃力了,下一篇将介绍如何用python的faker库生成测试数据。

以上这篇sqlserver生成连续数字根据指定的数字操作就是www.887551.com分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持www.887551.com。

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐