应用实例,生成1000个5位的不重复随机数

来源:互联网 发布:网络侵害名誉权 编辑:程序博客网 时间:2024/06/05 02:15

表的字段为: ID、会员卡号、卡类型、密码

会员卡   13000张   卡号不能重复
卡号要求为:长度为12位数   2000001013000——2000001000001
密码随机生成

贵宾卡:5000张  卡号不能重复
卡号要求为:长度为12位数   3000001005000——3000001000001
密码为随机生成

金卡:1500张   卡号不能重复
卡号要求为: 长度为12位数  5000001001500——5000001000001
密码为随机生成

白金卡:1000张   卡号不能重复
卡好要求为:长度为12位数   6000001001000——6000001000001
密码为随机生成

钻石卡:500张   卡号不能重复
卡号要求为: 长度为12位数  7000001000500——7000001000001
密码为随机生产


--------------------------------------


if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_rand]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_rand]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[v_rand]') and OBJECTPROPERTY(id, N'IsView') = 1)
drop view [dbo].[v_rand]
GO

--需要这样一个视图
create view v_rand as select re=rand()
go

/*----取得指定上下限的随机数

--邹建 2003.12(引用请保留此信息)--*/

/*--调用示例

select dbo.f_rand(10,100),dbo.f_rand(10,100)
--*/
create function f_rand(
@下限 int,
@上限 int
)
returns decimal(38,0)
as
begin
declare @r decimal(38,0)
select @r=cast(re*(@上限-@下限)+@下限 as decimal(38,0)) from v_rand
return(@r)
end
go


/*--应用实例,生成1000个5位的不重复随机数--*/

--生成随机数用到的临时表
create table #t(随机数 int unique) --用唯一约束保证不重复
go

--生成1000个5位的不重复随机数(错误提示不要理会,这是正常的)
declare @i int
set @i=1000  --1000要要生成的随机数的数量
while @i>0
begin
set rowcount @i
insert #t select dbo.f_rand(10000,99999) from sysobjects
set @i=@i-@@rowcount
end
set rowcount 0

--显示结果
select count(*) from #t
go

--删除测试
drop table #t

--自定义函数:取得指定上下限的随机数

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_rand]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_rand]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[v_rand]') and OBJECTPROPERTY(id, N'IsView') = 1)
drop view [dbo].[v_rand]
GO

--需要这样一个视图
create view v_rand as select re=rand(),re2=replace(cast(newid() as varchar(36)),'-','')
go

--自定义函数:取得指定上下限长度的随字符串

create function f_rand(
@最小 int,--最小长度(范围1-32)
@最大 int--最大长度(范围1-32)
)returns varchar(32)
as
begin
declare @r varchar(32)
select @r=left(re2,re*(@最大-@最小)+@最小) from v_rand
return(@r)
end
go

--调用示例
select dbo.f_rand(2,10),dbo.f_rand(2,10)

原创粉丝点击