威力加强版SQL随机数字和字母
2016-08-11 10:49
441 查看
最近接到一个任务,就是要求做一个类似刮刮乐的券码,用户刮开后,在我们的平台输入券码,然后就可以获得相应的积分了。
第一步,百度一下,结果发现网上的资料都是只能生成数字或者字母,好一点的,能区分字母大小写。但是我们要求字母混合的。
我想了想,于是乎,有了第一个版本
我这里,刚开始也没有想太多,就是人工的去确定哪个地方是数字,哪个地方是字母。结果,尼玛,这个方法根本跑不通!!!!!
上网看了看,说,因为rand() 函数是一个不确定函数,不能写在方法里面。还有一个newid(),这个两个二货都不能写在用户自定义函数里面。
好吧。只能再想方法。
这里的Convert(转换后类型,原数字)
好,学习过后,我们再来。搜了些资料,网上说,可以把rand()这个函数用视图来写,然后调用视图即可达到同样的效果。
ok,先上代码
这里解释一下,这四个RAND是干嘛的
RAND1:利用RAND1>1或者RAND<1来确定使用数字还是使用字母
RAND2:如果RAND1>1 使用字母的话, 利用RAND2>1或者RAND<2来确定使用大写还是小写
RAND3:返回26个字母的随机数,再配合字母的ASCII编号 ,就可以获的字母了
RNAD4:返回0-9个随机数字,再配合0的ASCII编号,就可以获得数字了。
传入参数多少位数,返回随机字母+随机数字混合
select DBO.f_GetRandNum(8)
至此,打完收工
第一步,百度一下,结果发现网上的资料都是只能生成数字或者字母,好一点的,能区分字母大小写。但是我们要求字母混合的。
我想了想,于是乎,有了第一个版本
CREATE FUNCTION DBO.f_GetRandNum() returns NVARCHAR(20) AS begin declare @sql nvarchar(20) set @sql='' SELECT @sql= 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))+ (RIGHT(STR(rand(),8,6),1))+ 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))+ (RIGHT(STR(rand(),8,6),1))+ 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)) RETURN @sql end
我这里,刚开始也没有想太多,就是人工的去确定哪个地方是数字,哪个地方是字母。结果,尼玛,这个方法根本跑不通!!!!!
上网看了看,说,因为rand() 函数是一个不确定函数,不能写在方法里面。还有一个newid(),这个两个二货都不能写在用户自定义函数里面。
好吧。只能再想方法。
知识点补充站:
1.转换函数
CONVERT(INT,rand()*26)这里的Convert(转换后类型,原数字)
2.rand()*26
rand()返回0-1的小数,所以rand()*26返回 0-26的数字。这个用法一般用作于 26个随机字母。26个随机数字再加上97,65,就是相应数字的大小写了。3.char
这个函数,就是把数字对应的ASCII码给调出来。好,学习过后,我们再来。搜了些资料,网上说,可以把rand()这个函数用视图来写,然后调用视图即可达到同样的效果。
ok,先上代码
CREATE VIEW V_RAND AS SELECT RAND1 = RAND()*2, RAND2 = RAND()*2, RAND3 = CONVERT(INT,RAND()*26), RAND4 = CONVERT(INT,RAND()*10) GO
这里解释一下,这四个RAND是干嘛的
RAND1:利用RAND1>1或者RAND<1来确定使用数字还是使用字母
RAND2:如果RAND1>1 使用字母的话, 利用RAND2>1或者RAND<2来确定使用大写还是小写
RAND3:返回26个字母的随机数,再配合字母的ASCII编号 ,就可以获的字母了
RNAD4:返回0-9个随机数字,再配合0的ASCII编号,就可以获得数字了。
知识点补充站
0的ASCII编号 48
a的ASCII编号 65
A的ASCII编号 97
ok,视图写完了,现在请出主角CREATE FUNCTION DBO.F_GETRANDNUM(@LEN INT) RETURNS NVARCHAR(100) AS BEGIN DECLARE @SQL NVARCHAR(100),@RAND INT ,@TEMP1 INT,@TEMP2 INT,@RANDAL INT SELECT @SQL = ' ' IF @LEN>100 SET @LEN = 100 WHILE @LEN>0 BEGIN /*这里是主要逻辑代码 当RAND1>1 使用字母 判断RAND2>1 使用大写,否者使用小写 当RAND1<1 使用数字*/ ----------------------------------------------------------- SELECT @TEMP1 =( CASE WHEN RAND1>1 THEN (CASE WHEN RAND2>1 THEN 97 ELSE 65 END ) END ), @TEMP2 =( CASE WHEN RAND1<1 THEN RAND4 END ),@RANDAL=RAND3 FROM V_RAND ----------------------------------------------------------- /* 当@TEMP1不为空的时候,说明当前循环选择的是字母 返回 26个随机数字+(97/95) 当@TEMP1为空的时候,说明当前循环选择的是数字 返回 48+阿拉伯随机数字 */ SELECT @SQL =@SQL+CASE WHEN @TEMP1 IS NOT NULL THEN CHAR(@RANDAL+@TEMP1) ELSE CHAR(48+@TEMP2) END SELECT @LEN=@LEN-1 END RETURN @SQL END
传入参数多少位数,返回随机字母+随机数字混合
select DBO.f_GetRandNum(8)
至此,打完收工
相关文章推荐
- redis之一内存回收
- Oracle数据库之PL/SQL程序设计基础
- 数据库设计原则(积累)
- mysql 5.7如何安装 mysql 5.7安装配置教程
- redis数据类型(List)
- 完整java开发中JDBC连接数据库代码和步骤 JDBC连接数据库
- oracle取数字,替换字符,查询树形结构,(+)
- redis数据类型(String)
- SQL Server 2012 新增语法
- mysql的master中slave的账号密码忘记的查看的办法
- C 链接mysql---预处理语句
- SQLServer还原 指定的转换无效解决方法
- 8天学通MongoDB——第八天 驱动实践
- 8天学通MongoDB——第七天 运维技术
- 8天学通MongoDB——第六天 分片技术
- 8天学通MongoDB——第五天 主从复制
- 8天学通MongoDB——第四天 索引操作
- 8天学通MongoDB——第三天 细说高级操作
- SQL Server 2008 数据类型-varchar(MAX)、nvarchar(MAX) 到底有多大?
- Oracle数据库之序列