使用随机字符串值更新列中的所有行以进行测试

时间:2017-01-11 16:11:31

标签: sql tsql sql-server-2016

我使用以下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()

1 个答案:

答案 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