Generating random strings with T-SQL

前端 未结 27 1750
青春惊慌失措
青春惊慌失措 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:58

    So I liked a lot of the answers above, but I was looking for something that was a little more random in nature. I also wanted a way to explicitly call out excluded characters. Below is my solution using a view that calls the CRYPT_GEN_RANDOM to get a cryptographic random number. In my example, I only chose a random number that was 8 bytes. Please note, you can increase this size and also utilize the seed parameter of the function if you want. Here is the link to the documentation: https://docs.microsoft.com/en-us/sql/t-sql/functions/crypt-gen-random-transact-sql

    CREATE VIEW [dbo].[VW_CRYPT_GEN_RANDOM_8]
    AS
    SELECT CRYPT_GEN_RANDOM(8) as [value];
    

    The reason for creating the view is because CRYPT_GEN_RANDOM cannot be called directly from a function.

    From there, I created a scalar function that accepts a length and a string parameter that can contain a comma delimited string of excluded characters.

    CREATE FUNCTION [dbo].[fn_GenerateRandomString]
    ( 
        @length INT,
        @excludedCharacters VARCHAR(200) --Comma delimited string of excluded characters
    )
    RETURNS VARCHAR(Max)
    BEGIN
        DECLARE @returnValue VARCHAR(Max) = ''
            , @asciiValue INT
            , @currentCharacter CHAR;
    
        --Optional concept, you can add default excluded characters
        SET @excludedCharacters = CONCAT(@excludedCharacters,',^,*,(,),-,_,=,+,[,{,],},\,|,;,:,'',",<,.,>,/,`,~');
    
        --Table of excluded characters
        DECLARE @excludedCharactersTable table([asciiValue] INT);
    
        --Insert comma
        INSERT INTO @excludedCharactersTable SELECT 44;
    
        --Stores the ascii value of the excluded characters in the table
        INSERT INTO @excludedCharactersTable
        SELECT ASCII(TRIM(value))
        FROM STRING_SPLIT(@excludedCharacters, ',')
        WHERE LEN(TRIM(value)) = 1;
    
        --Keep looping until the return string is filled
        WHILE(LEN(@returnValue) < @length)
        BEGIN
            --Get a truly random integer values from 33-126
            SET @asciiValue = (SELECT TOP 1 (ABS(CONVERT(INT, [value])) % 94) + 33 FROM [dbo].[VW_CRYPT_GEN_RANDOM_8]);
    
            --If the random integer value is not in the excluded characters table then append to the return string
            IF(NOT EXISTS(SELECT * 
                            FROM @excludedCharactersTable 
                            WHERE [asciiValue] = @asciiValue))
            BEGIN
                SET @returnValue = @returnValue + CHAR(@asciiValue);
            END
        END
    
        RETURN(@returnValue);
    END
    

    Below is an example of the how to call the function.

    SELECT [dbo].[fn_GenerateRandomString](8,'!,@,#,$,%,&,?');
    

    ~Cheers

    0 讨论(0)
  • 2020-11-29 18:59

    For one random letter, you can use:

    select substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                     (abs(checksum(newid())) % 26)+1, 1)
    

    An important difference between using newid() versus rand() is that if you return multiple rows, newid() is calculated separately for each row, while rand() is calculated once for the whole query.

    0 讨论(0)
  • 2020-11-29 19:00

    I'm not expert in T-SQL, but the simpliest way I've already used it's like that:

    select char((rand()*25 + 65))+char((rand()*25 + 65))
    

    This generates two char (A-Z, in ascii 65-90).

    0 讨论(0)
提交回复
热议问题