渔鱼

人生豪迈,在此一博!

  博客园 :: 首页 :: 博问 :: 闪存 :: :: 联系 :: 订阅 订阅 :: 管理 ::

原文出处:http://www.erya.cn/archives/200707/153.html

在目前正在带的项目中,有一个功能需要在数据库中随机产生一个字符串作为密码(在触发器中)。于是想到了写一个函数,但是结果却提示:在函数内的 'rand' 中对带副作用的或依赖于时间的运算符的使用无效。
    在网上查资料后得知,从SQL Server 2000以后,SQL Server的函数中不可以调用返回值不确定的函数。比如rand。变态的MS。于是想到用存储过程替代。存储过程如下:
IF OBJECT_ID ('RandomStr','P') IS NOT NULL
   DROP proc RandomStr
go
create proc RandomStr
 @RandomStr varchar(6) output
as
BEGIN
 declare @s varchar(60)  
 declare @r varchar(6)  
 declare @pos int
 declare @len int
 set @s = 'acdefhijkmnpqrstuvwxyABCDEFGHJKMNPQRSTUVWXY345678'  
 set @len = len(@s);
 set @r = ''  
   
 while len(@r) < 6  
 begin  
  set @pos = cast(rand()*100 as int);
  while @pos > @len or @pos <1
  begin
   if(@pos < 1)
    set @pos = cast(rand()*100 as int);
   else
    set @pos = cast(@pos /2 as int);
  end
  set @r = @r + substring(@s, @pos, 1)
 end  
 set @RandomStr = @r
END
    如下调用即可:
    declare @r varchar(6)
    exec RandomStr @r output

posted on 2008-01-29 16:53  博闻李  阅读(5716)  评论(0编辑  收藏  举报