最近在学习SqlServer中一些函数,存储过程,由于以前在中写过关于产生大数据量的存储过程,为了更好的熟悉中的一些函数和语法,想到在写一个利用sql生成大量数据的存储过程.
要生成的数据表是一个订单的信息,当然这里包括两部分,订单表和订单明细表。例如表结构如下:
订单表(订单号,订单名称,订单类型,备注)主键(订单号),由日期+3位流水号组成.
订单明细(订单行号,名称,物料类型,数量,订单号,备注)主键(订单行号,订单号).
在生成大数据量时采用的是循环插入数据,订单行号、订单类型,物料类型,名称都随机数的形式产生。以下是相应的存储过程:
Create Procedure GenerateData(@year varchar(20) ,@count_I int,@count_j int) /* @year 用于输入年份,@count_I主表中执行的次数,@count_j从表中循环的次数 */
as
begin
Declare @NO varchar(20), --定义订单号
@year_c varchar(20), --年份
@date varchar(20), --日期
@i int,
@liushuihao varchar(6), --生成订单号时产生的流水号
@j int,
@num varchar(6), --日期
@ordertype int, --订单类型
@ordername varchar(50), --订单名称
@k int
set @k=1
--判断传入的年份是否为空,如果为空,取当前的年份--
If @year=''
set @year_c=cast(year(getdate()) as varchar)
else
set @year_c=@year
--循环往表中插入数据--
while @k<13 --月份循环--
begin
set @i=1
If len(cast(@k as varchar))<2
set @date=cast(@year_c+'0'+cast(@k as varchar) as varchar)
else
set @date=cast(@year_c+cast(@k as varchar) as varchar)
while @i<@count_I --循环数据插入主表--
begin
set @j=1
-- print @j
-------------- --生成数据插入主表Tbl_Order------------------------------
set @num=cast(('000'+cast(@i as varchar)) as varchar)
set @liushuihao=substring(@num,len(@num)-3,4) --取流水号
set @No=cast((@date+@liushuihao) as varchar) --取订单号码
set @ordertype=cast( ceiling(rand()*5) as int) /*celling函数取随机数时从1----N之间*/
--以下是随机产生订单名称--
set @ordername=CHAR(CONVERT(INT,rand()*26)+(CASE WHEN RAND()*2 > 1 THEN 97 ELSE 65 END))+
CHAR(CONVERT(INT,rand()*26)+(CASE WHEN RAND()*2 > 1 THEN 97 ELSE 65 END))+
CHAR(CONVERT(INT,rand()*26)+(CASE WHEN RAND()*2 > 1 THEN 97 ELSE 65 END))+
CHAR(CONVERT(INT,rand()*26)+(CASE WHEN RAND()*2 > 1 THEN 97 ELSE 65 END))+
CHAR(CONVERT(INT,rand()*26)+(CASE WHEN RAND()*2 > 1 THEN 97 ELSE 65 END))+
CHAR(CONVERT(INT,rand()*26)+(CASE WHEN RAND()*2 > 1 THEN 97 ELSE 65 END))
--插入数据
insert into Tbl_Order ( OrderNo,
OrderName,
OrderType,
Remark )
values(@No,@ordername,@ordertype,'')
--------------生成数据插入明细表tbl_der_Detail-----------------------------
Declare @Order_lineNo int, @order_lineName varchar(60),@Ma_type int,@amount decimal(7,3)
while @j<@count_j
begin
set @ma_type=cast(ceiling(rand()*20) as int)
set @amount=cast(ceiling(rand()*1000) as decimal(7,3))
Set @order_lineName=CHAR(CONVERT(INT,rand()*26)+(CASE WHEN RAND()*2 > 1 THEN 97 ELSE 65 END))+
CHAR(CONVERT(INT,rand()*26)+(CASE WHEN RAND()*2 > 1 THEN 97 ELSE 65 END))+
CHAR(CONVERT(INT,rand()*26)+(CASE WHEN RAND()*2 > 1 THEN 97 ELSE 65 END))+
CHAR(CONVERT(INT,rand()*26)+(CASE WHEN RAND()*2 > 1 THEN 97 ELSE 65 END))+
CHAR(CONVERT(INT,rand()*26)+(CASE WHEN RAND()*2 > 1 THEN 97 ELSE 65 END))+
CHAR(CONVERT(INT,rand()*26)+(CASE WHEN RAND()*2 > 1 THEN 97 ELSE 65 END))
--插入表--
insert into Tbl_Order_Detail
( Order_lineNo,Order_lineName,Ma_type,OrderNo,amount,Remark)
values(@j,@Order_lineName,@Ma_type,@No,@amount,'')
Set @j=@j+1
End
set @i=@i+1
end
set @k=@k+1
end
end
接下来根据需要执行存储过程,将会自动插入数据到表中。例如:执行exec GenerateData '2011',11,11,在Tbl_Order中将会有120条记录,在Tbl_Order_Detail中将会有1200条数据。由于平时用Sql比较少,对Sqlserver中的函数也不是很熟悉,存储过程写的太复杂或存在问题,还希望路过的朋友多多指正。