Sql Server如何实现生成连续数字根据指定的数字
创始人
2024-11-17 03:01:53
0次

一、Oracle使用ROWNUM实现方式

SELECT 
 ROWNUM number_list
FROM 表名
WHERE ROWNUM <= 10;

Sql Server如何实现生成连续数字根据指定的数字

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

1.使用MASTER…spt_values方式

SELECT
 number 
FROM
 MASTER..spt_values 
WHERE
 TYPE = 'P' 
 AND number > 0 
 AND number <= 10;

Sql Server如何实现生成连续数字根据指定的数字

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;

Sql Server如何实现生成连续数字根据指定的数字

第一种方式对数据库版本无要求,但是取值范围有限制0~2047;

第二种方式对数据库版本有要求,要在2016及之上;

第三种方式对数据库版本无要求,只要表里的数据量大于要生成的数字即可;

补充知识:数据库生成测试数据(SQL实现)

需求

项目中偶尔会有造数据进行测试的情况,根据常见的数据特征,我这里假设数据某表Table_X含4个字段,每个字段的要求如下,需要造出5000条数据。

Sql Server如何实现生成连续数字根据指定的数字

以上需求看上去非常简单,但比较具有代表性,复杂需求也是由小需求排列组合而成。

功能准备

随机数

造数的核心功能是生成随机数,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库生成测试数据。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...