威力加强版SQL随机数字和字母

最近接到一个任务,就是要求做一个类似刮刮乐的券码,用户刮开后,在我们的平台输入券码,然后就可以获得相应的积分了。

第一步,百度一下,结果发现网上的资料都是只能生成数字或者字母,好一点的,能区分字母大小写。但是我们要求字母混合的。

我想了想,于是乎,有了第一个版本

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)

至此,打完收工

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值