我使用以下SQL来使用varchar
的用户定义函数创建我的随机generateString()
。
CREATE VIEW rndView
AS
SELECT RAND() rndResult
GO
CREATE FUNCTION RandFn()
RETURNS DECIMAL(18,18)
AS
BEGIN
DECLARE @rndValue DECIMAL(18,18)
SELECT @rndValue = rndResult
FROM rndView
RETURN @rndValue
END
GO
ALTER FUNCTION generateString()
RETURNS VARCHAR
AS
BEGIN
DECLARE @exclude varchar(50)
SET @exclude = '0:;<=>?@O[]`^\/'
DECLARE @char char
DECLARE @len char
DECLARE @output varchar(50)
SET @output = ''
SET @len = 8
DECLARE @random DECIMAL(18,18) = (SELECT dbo.RandFn())
while @len > 0 begin
select @char = char(round(@random * 74 + 48, 0))
if charindex(@char, @exclude) = 0 begin
set @output = @output + @char
set @len = @len - 1
end
end
RETURN @output
END
但是,当尝试在下面的UPDATE
子句中使用此函数时,查询永远不会完成。我的记录不到100条。目标是将随机varchar
数据放入表格中特定列的所有行...
UPDATE dbo.Inci
SET SerialText = dbo.generateString()
答案 0 :(得分:2)
当@char
有一个排除字符'0:;<=>?@O[]``^\/'
时,如果条件wll失败并且@len
不会递减,那么在下一个循环中也会有相同的@random
值使用和生成相同的@char
因此它将进行无限循环。
在@random
循环内移动while
变量的初始化,以在每个循环中生成新的随机值。
DECLARE @random DECIMAL(18,18)
while @len > 0 begin
SELECT @random = dbo.RandFn()
select @char = char(round(@random * 74 + 48, 0))
if charindex(@char, @exclude) = 0 begin
set @output = @output + @char
set @len = @len - 1
end
end