关于 SQL Server 测试用的随机数据生成
作者:谎言诞行    发布时间:2024年10月22日

最近由于要测试微软的 Microsoft SQL Server 数据库,所以搞了一个测试用的随机数据生成处理。在测试时,我用的是 SQL Server 2016 developer 版本(开发者版)。测试的客户端工具是 SQL Server Management Studio ( SSMS ) 20.2.30.0 。


那么,接下来,简单描述下,本文的概要:

  • 数据库中的随机数处理

  • 随机数视图处理

  • 随机函数处理

  • 随机数据生成脚本


一、数据库中的随机数处理

经过网上搜索资料,SQL Server 中随机数主要是由 rand 函数处理。它可以带一个整形参数,作为随机种子。如果不带参数,则为完全随机数(0~1之间的浮点数)。参考如下:

select rand(); /* 执行结果:0.636519465249598 */

既然,随机数是一个浮点数;那么,我们可以使用它生成各种各样的随机数据。另外,有一点要注意的是,SQL Server 中没有提供随机字符串的处理函数。所以,我们需要自己写一个随机字符串的处理,然后才能完成我们的目标,生成一堆随机数据,插入测试表中


二、随机数视图处理

由于在 SQL Server 中,自定义函数是不能直接使用 rand 函数的。所以,我们需要建一个视图来间接处理。视图建立脚本如下:

create view V_RANDOM as select RAND() as RVALUE;

可以通过以下脚本,来查看视图是否生效:

select RVALUE from V_RANDOM;


三、随机函数处理

这里我们已经把前置条件都处理了。接下来,我们开始写几个随机处理函数。本人的思路很简单:

1、首先,通过自定义函数,获取一个指定范围的,随机整数。

2、然后,通过这个随机的整数,截取一段字符串上的某个字符。

3、最后,循环多次获取随机字符,拼接成为一个随机字符串。

实现方式如下:

构建随机整数的函数实现

create function F_GET_RANDOM_INT(
	@start int, -- 随机数的最小值
	@end int    -- 随机数的最大值
)
returns int
as
begin
	-- 定义一个 变量 用于获取随机小数
	declare @rv float;

	-- 获取浮点值
	select @rv=RVALUE from V_RANDOM;

	return floor(@rv*(@end-@start+1)+@start);
end;

构建随机字符的函数实现(这里需要用 nvarchar,否则中文,截取不出来)

create function F_GET_RANDOM_CHAR(
	@string nvarchar(MAX) -- 用于随机处理的字符范围
)
returns nvarchar(1)
as
begin
	
	declare @ri int;     -- 定义一个 变量 用于获取随机整数
	declare @rc nvarchar(1); -- 定义一个 变量 用于获取随机字符
	declare @strLength int; -- 字符串长度

	-- 范围字符串的长度
	select @strLength = LEN(@string);

	-- 获取随机整数
	select @ri=dbo.F_GET_RANDOM_INT(0, @strLength-1);

	-- 根据整数,截取字符
	select @rc=SUBSTRING(@string, @ri+1, 1);

	return @rc;
end;

构建随机字符串的函数实现

create function F_GET_RANDOM_STR(
	@string varchar(MAX), -- 用于随机处理的字符范围
	@len int              -- 要生成的字符串长度
)
returns nvarchar(MAX)
as
begin
	declare @rs nvarchar(MAX); -- 定义一个返回结果的变量,结果通常是拼接的字符串。
	declare @count int;       -- 定义要循环的次数

	-- 设置 循环次数
	set @count = @len;
	
	-- 结果初始化
	set @rs = '';

	while @count > 0
	begin
		-- 
		set @rs = @rs + dbo.F_GET_RANDOM_CHAR(@string);

		-- 循环次数处理
	    set @count = @count - 1;
	end;

	-- 返回
	return @rs;
end;

各函数测试效果如下:

image.png

image.png

image.png

image.png


四、随机数据生成脚本

接下来,就是我们今天最重要的随机数据生成脚本了。

首先是表(test_insert)结构:(id字段是 自增列

image.png

然后,是我们的处理脚本:

begin
	declare @count int; -- 定义一个循环次数

	declare @randomStrCHN varchar(max);
	declare @randomStrENG varchar(max);
	declare @randomStrNUM varchar(max);
	
	declare @name varchar(100);
	declare @age int;
	declare @addr varchar(500);
	declare @email varchar(500);
	declare @tel varchar(100);

	set @count = 1000000;
	set @randomStrENG = 'abcdefghijklmnopqrstuvwxyz';
	set @randomStrCHN = '数量的反抗精神的老夫电视机分厘卡即使的身份带领大家是否快乐圣诞节分厘卡圣诞节';
	set @randomStrNUM = '0123456789';

	while @count > 0
	begin
		set @name = dbo.F_GET_RANDOM_STR(@randomStrCHN, 4);
		set @age = dbo.F_GET_RANDOM_INT(1,100);
		set @addr = dbo.F_GET_RANDOM_STR(@randomStrCHN, 20);
		set @email = dbo.F_GET_RANDOM_STR(@randomStrENG, 10) + '@gmail.com';
		set @tel = dbo.F_GET_RANDOM_STR(@randomStrNUM, 11);

		insert into test_insert(name, age, address, email,tel) values(@name, @age, @addr, @email, @tel);

		set @count = @count - 1;
	end

end;

最后,我们看下插入后的数据结果:

image.png

为了测试执行效率,我插入了 1,000,000 行数据。总执行时间是:16-17 分钟。(自己电脑,硬盘比较慢

image.png


谢谢观赏 !


填写一种颜色的字符(不区分大小写),1分钟有效,点击图片刷新