Generating random strings with T-SQL

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

    This worked for me: I needed to generate just three random alphanumeric characters for an ID, but it could work for any length up to 15 or so.

    declare @DesiredLength as int = 3;
    select substring(replace(newID(),'-',''),cast(RAND()*(31-@DesiredLength) as int),@DesiredLength);
    
    0 讨论(0)
  • 2020-11-29 18:48

    I use this procedure that I developed simply stipluate the charaters you want to be able to display in the input variables, you can define the length too. Hope this formats well, I am new to stack overflow.

    IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND object_id = OBJECT_ID(N'GenerateARandomString'))
    DROP PROCEDURE GenerateARandomString
    GO
    
    CREATE PROCEDURE GenerateARandomString
    (
         @DESIREDLENGTH         INTEGER = 100,                  
         @NUMBERS               VARCHAR(50) 
            = '0123456789',     
         @ALPHABET              VARCHAR(100) 
            ='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
         @SPECIALS              VARCHAR(50) 
            = '_=+-$£%^&*()"!@~#:', 
         @RANDOMSTRING          VARCHAR(8000)   OUT 
    
    )
    
    AS
    
    BEGIN
        -- Author David Riley
        -- Version 1.0 
        -- You could alter to one big string .e.e numebrs , alpha special etc
        -- added for more felxibility in case I want to extend i.e put logic  in for 3 numbers, 2 pecials 3 numbers etc
        -- for now just randomly pick one of them
    
        DECLARE @SWAP                   VARCHAR(8000);      -- Will be used as a tempoary buffer 
        DECLARE @SELECTOR               INTEGER = 0;
    
        DECLARE @CURRENTLENGHT          INTEGER = 0;
        WHILE @CURRENTLENGHT < @DESIREDLENGTH
        BEGIN
    
            -- Do we want a number, special character or Alphabet Randonly decide?
            SET @SELECTOR  = CAST(ABS(CHECKSUM(NEWID())) % 3 AS INTEGER);   -- Always three 1 number , 2 alphaBET , 3 special;
            IF @SELECTOR = 0
            BEGIN
                SET @SELECTOR = 3
            END;
    
            -- SET SWAP VARIABLE AS DESIRED
            SELECT @SWAP = CASE WHEN @SELECTOR = 1 THEN @NUMBERS WHEN @SELECTOR = 2 THEN @ALPHABET ELSE @SPECIALS END;
    
            -- MAKE THE SELECTION
            SET @SELECTOR  = CAST(ABS(CHECKSUM(NEWID())) % LEN(@SWAP) AS INTEGER);
            IF @SELECTOR = 0
            BEGIN
                SET @SELECTOR = LEN(@SWAP)
            END;
    
            SET @RANDOMSTRING = ISNULL(@RANDOMSTRING,'') + SUBSTRING(@SWAP,@SELECTOR,1);
            SET @CURRENTLENGHT = LEN(@RANDOMSTRING);
        END;
    
    END;
    
    GO
    
    DECLARE @RANDOMSTRING VARCHAR(8000)
    
    EXEC GenerateARandomString @RANDOMSTRING = @RANDOMSTRING OUT
    
    SELECT @RANDOMSTRING
    
    0 讨论(0)
  • 2020-11-29 18:48

    For SQL Server 2016 and later, here is a really simple and relatively efficient expression to generate cryptographically random strings of a given byte length:

    --Generates 36 bytes (48 characters) of base64 encoded random data
    select r from OpenJson((select Crypt_Gen_Random(36) r for json path)) 
      with (r varchar(max))
    

    Note that the byte length is not the same as the encoded size; use the following from this article to convert:

    Bytes = 3 * (LengthInCharacters / 4) - Padding
    
    0 讨论(0)
  • 2020-11-29 18:48

    I thought I'd share, or give back to the community ... It's ASCII based, and the solution is not perfect but it works quite well. Enjoy, Goran B.

    /* 
    -- predictable masking of ascii chars within a given decimal range
    -- purpose: 
    --    i needed an alternative to hashing alg. or uniqueidentifier functions
    --    because i wanted to be able to revert to original char set if possible ("if", the operative word)
    -- notes: wrap below in a scalar function if desired (i.e. recommended)
    -- by goran biljetina (2014-02-25)
    */
    
    declare 
    @length int
    ,@position int
    ,@maskedString varchar(500)
    ,@inpString varchar(500)
    ,@offsetAsciiUp1 smallint
    ,@offsetAsciiDown1 smallint
    ,@ipOffset smallint
    ,@asciiHiBound smallint
    ,@asciiLoBound smallint
    
    
    set @ipOffset=null
    set @offsetAsciiUp1=1
    set @offsetAsciiDown1=-1
    set @asciiHiBound=126 --> up to and NOT including
    set @asciiLoBound=31 --> up from and NOT including
    
    SET @inpString = '{"config":"some string value", "boolAttr": true}'
    SET @length = LEN(@inpString)
    
    SET @position = 1
    SET @maskedString = ''
    
    --> MASK:
    ---------
    WHILE (@position < @length+1) BEGIN
        SELECT @maskedString = @maskedString + 
        ISNULL(
            CASE 
            WHEN ASCII(SUBSTRING(@inpString,@position,1))>@asciiLoBound AND ASCII(SUBSTRING(@inpString,@position,1))<@asciiHiBound
             THEN
                CHAR(ASCII(SUBSTRING(@inpString,@position,1))+
                (case when @ipOffset is null then
                case when ASCII(SUBSTRING(@inpString,@position,1))%2=0 then @offsetAsciiUp1 else @offsetAsciiDown1 end
                else @ipOffset end))
            WHEN ASCII(SUBSTRING(@inpString,@position,1))<=@asciiLoBound
             THEN '('+CONVERT(varchar,ASCII(SUBSTRING(@Inpstring,@position,1))+1000)+')' --> wrap for decode
            WHEN ASCII(SUBSTRING(@inpString,@position,1))>=@asciiHiBound
             THEN '('+CONVERT(varchar,ASCII(SUBSTRING(@inpString,@position,1))+1000)+')' --> wrap for decode
            END
            ,'')
        SELECT @position = @position + 1
    END
    
    select @MaskedString
    
    
    SET @inpString = @maskedString
    SET @length = LEN(@inpString)
    
    SET @position = 1
    SET @maskedString = ''
    
    --> UNMASK (Limited to within ascii lo-hi bound):
    -------------------------------------------------
    WHILE (@position < @length+1) BEGIN
        SELECT @maskedString = @maskedString + 
        ISNULL(
            CASE 
            WHEN ASCII(SUBSTRING(@inpString,@position,1))>@asciiLoBound AND ASCII(SUBSTRING(@inpString,@position,1))<@asciiHiBound
             THEN
                CHAR(ASCII(SUBSTRING(@inpString,@position,1))+
                (case when @ipOffset is null then
                case when ASCII(SUBSTRING(@inpString,@position,1))%2=1 then @offsetAsciiDown1 else @offsetAsciiUp1 end
                else @ipOffset*(-1) end))
            ELSE ''
            END
            ,'')
        SELECT @position = @position + 1
    END
    
    select @maskedString
    
    0 讨论(0)
  • 2020-11-29 18:50

    I came across this blog post first, then came up with the following stored procedure for this that I'm using on a current project (sorry for the weird formatting):

    CREATE PROCEDURE [dbo].[SpGenerateRandomString]
    @sLength tinyint = 10,
    @randomString varchar(50) OUTPUT
    AS
    BEGIN
    SET NOCOUNT ON
    DECLARE @counter tinyint
    DECLARE @nextChar char(1)
    SET @counter = 1
    SET @randomString = ”
    
    WHILE @counter <= @sLength
    BEGIN
    SELECT @nextChar = CHAR(48 + CONVERT(INT, (122-48+1)*RAND()))
    
    IF ASCII(@nextChar) not in (58,59,60,61,62,63,64,91,92,93,94,95,96)
    BEGIN
    SELECT @randomString = @randomString + @nextChar
    SET @counter = @counter + 1
    END
    END
    END
    
    0 讨论(0)
  • 2020-11-29 18:50

    Below are the way to Generate 4 Or 8 Characters Long Random Alphanumeric String in SQL

    select LEFT(CONVERT(VARCHAR(36),NEWID()),4)+RIGHT(CONVERT(VARCHAR(36),NEWID()),4)
    

     SELECT RIGHT(REPLACE(CONVERT(VARCHAR(36),NEWID()),'-',''),8)
    
    0 讨论(0)
提交回复
热议问题