Generating random strings with T-SQL

前端 未结 27 1921
青春惊慌失措
青春惊慌失措 2020-11-29 18:10

If you wanted to generate a pseudorandom alphanumeric string using T-SQL, how would you do it? How would you exclude characters like dollar signs, dashes, and slashes from

27条回答
  •  半阙折子戏
    2020-11-29 18:42

    There are a lot of good answers but so far none of them allow a customizable character pool and work as a default value for a column. I wanted to be able to do something like this:

    alter table MY_TABLE add MY_COLUMN char(20) not null
      default dbo.GenerateToken(crypt_gen_random(20))
    

    So I came up with this. Beware of the hard-coded number 32 if you modify it.

    -- Converts a varbinary of length N into a varchar of length N.
    -- Recommend passing in the result of CRYPT_GEN_RANDOM(N).
    create function GenerateToken(@randomBytes varbinary(max))
    returns varchar(max) as begin
    
    -- Limit to 32 chars to get an even distribution (because 32 divides 256) with easy math.
    declare @allowedChars char(32);
    set @allowedChars = 'abcdefghijklmnopqrstuvwxyz012345';
    
    declare @oneByte tinyint;
    declare @oneChar char(1);
    declare @index int;
    declare @token varchar(max);
    
    set @index = 0;
    set @token = '';
    
    while @index < datalength(@randomBytes)
    begin
        -- Get next byte, use it to index into @allowedChars, and append to @token.
        -- Note: substring is 1-based.
        set @index = @index + 1;
        select @oneByte = convert(tinyint, substring(@randomBytes, @index, 1));
        select @oneChar = substring(@allowedChars, 1 + (@oneByte % 32), 1); -- 32 is the number of @allowedChars
        select @token = @token + @oneChar;
    end
    
    return @token;
    
    end
    

提交回复
热议问题