代码实现测试数据
当需要手动在添加数据库添加测试数据时,如果数据量大是绝对不考虑亲手一条一条输入的,此时选择用sql循环写入数据。
例如图示结构的一张表
其中,ObjID和EquipID都设置为从1递增的整数,TireCode和StationCache是不重要的字段随意赋值,VulNum、LocNum、CatchNum在业务上为0或1或2的整数。要生成100条测试数据,那么写这样一段SQL:
truncate table WCSVulStatus
DECLARE @i int
DECLARE @vul int
DECLARE @loc int
DECLARE @catch int
Set @i = 1
WHILE @i < 101 BEGIN
set @vul = cast(round(100*rand(),0)as int) % 3
set @loc = cast(round(100*rand(),0)as int) % 3
set @catch = cast(round(100*rand(),0)as int) % 3
insert into WCSVulStatus values(@i,@i,'1','null',@vul,@loc,@catch)
Set @i =@i +1
END
GO
SELECT * FROM WCSVulStatus
这段代码清空了WCSVulStatus表里原有的数据并插入了100条测试数据,每条测试数据的VulNum,LocNum,CatchNum都是随机生成的(不必纠结这里的概率不等问题)。
然而在写这段代码时踩到一个坑,我所需要的0,1,2这三个数字可以通过用3对一个随机整数取余得到,可我却没有关注到这个随机整数的细节。
执行select round(100*rand(),0)
,我们可以获得一个100以内的随机整数,当我直接用3去对它取余时,select round(100*rand(),0) % 3
,却得到了这个报错信息数据类型 float 和 int 在 modulo 运算符中不兼容。
。也就是说,虽然前面看似拿到了整数,但它本质还是一个float类型的数据,不能用来做取余运算(原因不明)。
于是决定使用cast做一个类型转换,能够正常运行。