博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
三个随机产生密码的存储过程
阅读量:5169 次
发布时间:2019-06-13

本文共 2382 字,大约阅读时间需要 7 分钟。

协助一个朋友做一个小网站,其中一个功能,是让用户注册成功之后,系统将随机产生一个登录密码,并自动发送至注册邮箱中,朋友的做法是为了用户使用真实邮箱。

随机产生密码,Insus.NET总结了三个,并分别写成了存储过程。

第一个,

ExpandedBlockStart.gif
usp_RandomPassword
CREATE 
PROCEDURE 
[
dbo
].
[
usp_RandomPassword
] 
(
   
@Length 
INT 
= 
8
)
AS
BEGIN      
    
DECLARE 
@RandomPassword 
NVARCHAR(
MAX
= N
'',
@L 
INT 
= 
1
    
WHILE 
@L 
<= 
@Length  
--
循环密码长度
    
BEGIN
        
--
随机产生每一位字符,ASCII码48至122
        
DECLARE 
@RndChar 
CHAR(
1
= 
CHAR(
ROUND(
RAND() 
* (
122
-
48
+
1
+ 
48,
0))
        
--
随机产生的字符不包括下面字符
        
IF 
ASCII(
@RndChar
NOT 
IN(
58,
59,
60,
61,
62,
63,
64,
91,
92,
93,
94,
95,
96
--
 : , ; , < , = , > , ? ,@ , [ , \ , ] , ^ , _ , `
        
BEGIN
            
SET 
@RandomPassword 
= 
@RandomPassword 
+ 
@RndChar
            
SET 
@L 
= 
@L 
+ 
1
        
END        
    
END
    
SELECT 
@RandomPassword
END

 

第二个,

ExpandedBlockStart.gif
usp_RandomPassword
CREATE 
PROCEDURE 
[
dbo
].
[
usp_RandomPassword
] 
(
   
@Length 
INT 
= 
8
)
AS
BEGIN  
    
DECLARE 
@RandomPassword 
NVARCHAR(
MAX
= N
'',
@L 
INT 
= 
1
    
--
随机密码将由下面字符串产生,数字0-9,大写字母A-Z,小写字母a-z
    
DECLARE 
@BaseString 
VARCHAR(
255
= 
'
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
'  
    
WHILE 
@L 
<= 
@Length 
--
循环密码长度
    
BEGIN
        
--
61是变量@BaseString的长度减一
        
SET 
@RandomPassword 
= 
@RandomPassword 
+ 
SUBSTRING(
@BaseString
CONVERT(
INT,
ROUND(
RAND() 
* 
61 
+ 
1,
0)),
1)
        
SET 
@L 
= 
@L 
+ 
1
    
END
    
SELECT 
@RandomPassword
END

 

第三个,

ExpandedBlockStart.gif
usp_RandomPassword
CREATE 
PROCEDURE 
[
dbo
].
[
usp_RandomPassword
] 
(
   
@Length 
INT 
= 
8
)
AS
BEGIN  
    
DECLARE 
@RandomPassword 
NVARCHAR(
MAX
= N
'' 
    
DECLARE 
@R 
TINYINT,
@L 
INT 
= 
1      
    
WHILE  
@L 
<= 
@Length 
--
循环密码长度
    
BEGIN
        
SET 
@R 
= 
ROUND(
RAND() 
* 
2
0)    
--
随机产生0,1,2整数
        
IF 
@R 
= 
0 
--
当变量为0时,将随机产生一位数字
            
SET 
@RandomPassword 
= 
@RandomPassword 
+ 
CHAR(
ROUND(
RAND() 
* 
9 
+ 
48,
0)) 
        
ELSE 
IF 
@R 
= 
1 
--
当变量为1时,将随机产生一位大写字母
            
SET 
@RandomPassword 
= 
@RandomPassword 
+ 
CHAR(
ROUND(
RAND() 
* 
25 
+ 
65,
0)) 
        
ELSE 
IF 
@R 
= 
2 
--
当变量为2时,将随机产生一位小写字母
            
SET 
@RandomPassword 
= 
@RandomPassword 
+ 
CHAR(
ROUND(
RAND() 
* 
25 
+ 
97,
0))            
        
SET 
@L 
= 
@L 
+ 
1
    
END
    
SELECT 
@RandomPassword
END

 

最后一个也可以重构写成:

ExpandedBlockStart.gif
usp_RandomPassword
CREATE 
PROCEDURE 
[
dbo
].
[
usp_RandomPassword
] 
(
   
@Length 
INT 
= 
8
)
AS
BEGIN  
    
DECLARE 
@RandomPassword  
NVARCHAR(
MAX
= N
'',
@L 
INT 
= 
1   
    
WHILE 
@L 
<= 
@Length 
--
循环密码长度
    
BEGIN         
        
DECLARE 
@R 
INT 
= 
ROUND(
RAND() 
* 
2
0
        
SET 
@RandomPassword 
= 
@RandomPassword 
+ 
CASE 
@R
        
WHEN 
0 
THEN 
CHAR(
ROUND(
RAND() 
* 
9 
+ 
48,
0)) 
        
WHEN 
1 
THEN 
CHAR(
ROUND(
RAND() 
* 
25 
+ 
65,
0)) 
        
WHEN 
2 
THEN 
CHAR(
ROUND(
RAND() 
* 
25 
+ 
97,
0)) 
END                            
        
SET 
@L 
= 
@L 
+ 
1        
    
END
    
SELECT 
@RandomPassword
END

 

Also reference:

 

 

转载于:https://www.cnblogs.com/insus/archive/2012/01/31/2333102.html

你可能感兴趣的文章
4.AE中的缩放,书签
查看>>
给一次重新选择的机会_您还会选择程序员吗?
查看>>
Mysql MHA高可用集群架构
查看>>
心急的C小加
查看>>
编译原理 First,Follow,select集求法
查看>>
iOS开发 runtime实现原理以及实际开发中的应用
查看>>
android 学习资源网址
查看>>
qt安装遇到的错误
查看>>
java:Apache Shiro 权限管理
查看>>
objective c的注释规范
查看>>
FreeNas安装配置使用
查看>>
Django(一)框架简介
查看>>
Python操作SQLite数据库的方法详解
查看>>
菜单和工具条(二)
查看>>
hadoop17---RPC和Socket的区别
查看>>
使用JMeter代理录制app测试脚本
查看>>
Linq to Object实现分页获取数据
查看>>
mac常用系统命令
查看>>
android上传文件到服务器
查看>>
我回答了90%的面试题,为什么还被拒?
查看>>