Thủ tục tạo chuỗi ký tự ngẫu nhiên trong Mssql

Bạn muốn tạo một chuỗi ký từ ngẫu nhiên như việc tạo Password, Hay tạo mã sản phẩm? Trên hmweb đã có bài tạo chuỗi ngẫu nhiên bằng C#. Bài này tôi giới thiệu thủ tục trong SQL server

Thủ tục được tạo như sau:

CREATE PROCEDURE [dbo].[sp_GeneratePassword]
    @Length int
AS
BEGIN
    DECLARE @RandomID varchar(32)
    DECLARE @counter smallint
    DECLARE @RandomNumber float
    DECLARE @RandomNumberInt tinyint
    DECLARE @CurrentCharacter varchar(1)
    DECLARE @ValidCharacters varchar(255)
    SET @ValidCharacters='ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
    DECLARE @ValidCharactersLength int
    SET @ValidCharactersLength = len(@ValidCharacters)
    SET @CurrentCharacter = ''
    SET @RandomNumber = 0
    SET @RandomNumberInt = 0
    SET @RandomID = ''
    SET NOCOUNT ON
    SET @counter = 1
    WHILE @counter < (@Length + 1)
    BEGIN
        SET @RandomNumber = Rand()
        SET @RandomNumberInt = Convert(tinyint, 
            ((@ValidCharactersLength - 1) * @RandomNumber + 1))
        SELECT @CurrentCharacter = 
            SUBSTRING(@ValidCharacters, @RandomNumberInt, 1)
        SET @counter = @counter + 1
        SET @RandomID = @RandomID + @CurrentCharacter
    End
    Select @RandomID As Pass
END

Thủ tục này sẽ lấy chuỗi ngâu nhiên bao gồm @Length ký tự từ chuỗi cho trước ABC...YZ1234567890.
Ví dụ bạn muốn lấy chuỗi ngẫu nhiên có độ dài là 8 ký tự bạn thực hiện: Exec sp_GeneratePassword 8 Sẽ sinh ra cho bạn chuỗi '9WAVZ3'

Thủ tục trên chỉ lấy ngẫu nhiên trong dãy ký tự đã có trước. Giờ bạn cải tiến đi một chút để dãy ký tự này cũng được chuyền vào thành tham số như sau:

CREATE  PROCEDURE sGeneratePassword_InputString 
    @Length int,
    @InputString nvarchar(255)
AS
BEGIN
    DECLARE @RandomID varchar(32)
    DECLARE @counter smallint
    DECLARE @RandomNumber float
    DECLARE @RandomNumberInt tinyint
    DECLARE @CurrentCharacter varchar(1)
    DECLARE @InputStringLength int
    SET @InputStringLength = len(@InputString)
    SET @CurrentCharacter = ''
    SET @RandomNumber = 0
    SET @RandomNumberInt = 0
    SET @RandomID = ''
    SET NOCOUNT ON
    SET @counter = 1
    WHILE @counter < (@Length + 1)
    BEGIN
            SET @RandomNumber = Rand()
            SET @RandomNumberInt = Convert(tinyint, ((@InputStringLength - 1) * @RandomNumber + 1))
            SELECT @CurrentCharacter = SUBSTRING(@InputString, @RandomNumberInt, 1)
            SET @counter = @counter + 1
            SET @RandomID = @RandomID + @CurrentCharacter
    End
    Select @RandomID As Pass
END

Giờ bạn chạy thử với lệnh:

 

Exec sGeneratePassword_InputString 8,'abcqwertyuiolkjAHSNKA09876jh&654321'


Biến thứ 2 là tùy ý bạn truyền vào một dãy ký tự tùy thích kết quả minh họa là '60rje52u', Với mỗi lần thực thi thì kết quả sẽ một khác

Hy vọng nó có ích với bạn. Chúc bạn thành công