原文出处: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