向一个表中插入N条数据的存储过程,其中用到了生成随机数、日期差、循环、选择等。在Sybase数据库中编写的,其他数据库没有试过是否兼容,仅供参考。
在取随机数的时候我使用的是先转成字符串,然后截取右边数,再转为int型的方法。还有人提到可以给rand()乘以一个100或者1000,然后取整,但我认为这个方法不太严谨。
因为rand()取出的是一个0~1之间的随机数,也就是说是有可能出现0.0000323525这种情况,即使乘以一个非常大的数字,从理论上也是有可能出现问题的,所以自认为还是
采用截取右边的字符串方式更为严谨。
下面是sql存储过程:
--可以修改执行存储过程的输入参数,实现插入N条数据的目的
--其中出生日期、姓名、性别、ID都是随机生成的,年龄根据出生日期确定
--创建表
IF EXISTS (SELECT id FROM sysobjects WHERE type='U' AND name='T_USER')
DROP TABLE T_USER
GO
CREATE TABLE T_USER(
id VARCHAR(36),
name VARCHAR(50),
age INTEGER,
gender CHAR(4),
birthday DATETIME
)
GO
--删除存储过程
IF EXISTS (SELECT id FROM sysobjects WHERE type='P' AND name='INSERT_USERS')
DROP PROCEDURE INSERT_USERS
--创存储过程
CREATE PROCEDURE INSERT_USERS
@number INTEGER
AS
DECLARE
@i INTEGER, --循环变量
@name VARCHAR(50), --姓名
@str VARCHAR(26), --英文字母
@age INTEGER, --年龄
@l_UUID VARCHAR(36), --主键UUID
@gender CHAR(4), --性别
@gender_num INTEGER, --性别代码
@name_size INTEGER, --姓名长度
@birthday DATETIME --生日
BEGIN
SELECT @i = 0
SELECT @str = 'abcdefghijklmnopqrstuvwxyz'
WHILE @i<@number
BEGIN
SELECT @l_UUID = NEWID()
SELECT @name_size = (SELECT CAST(RIGHT(CAST(rand() AS VARCHAR(50)),1) as int))
SELECT @name =''
WHILE @name_size > 0
BEGIN
SELECT @name =@name + substring(@str,(SELECT CAST(RIGHT(CAST(rand() AS VARCHAR(50)),2) as int))%26,1)
SELECT @name_size = @name_size - 1
END
SELECT @gender_num = (SELECT CAST(RIGHT(CAST(rand() AS VARCHAR(50)),1) as int))
IF @gender_num/2 = 0
SELECT @gender = '女'
ELSE
SELECT @gender = '男'
SELECT @birthday = dateadd(day,-floor(rand()*30000),getdate())
SELECT @age = datediff(yy,@birthday,getdate())
INSERT INTO T_USER
(
id,
name,
age,
gender,
birthday
)
VALUES
(
@l_UUID,
@name,
@age,
@gender,
@birthday
)
SELECT @i = @i + 1
END
SELECT * FROM T_USER
END
--存储过程结束
--执行存储过程
GO
DECLARE @number INTEGER
EXEC INSERT_USERS 100000 --插入数据量,可修改
GO