Losowe znaki Czasami istnieje potrzeba wypełnienia danej kolumny, mówiąc delikatnie byle czym.

W takim celu wypadałoby stworzyć jakiś generator tworzący napis z losowym ciągiem znaków. Kiedyś w pracy otrzymałem takie zadanie i z tego, co pamiętam wykorzystałem tę procedurę także do tworzenia losowych haseł oraz do generowania kuponów testowych w aplikacji loteryjnej..

Poniżej prezentuję procedurę tworzącą napis z losowych znaków. Nie wiem jak bardzo ten sposób jest wydajny, bo nie jestem bazodanowcem, ale ten kod został zaakceptowany w moim środowisku pracy.

CREATE PROCEDURE [dbo].[uspCreateRandomVarchar]
	@Lenght INT, -- długość napisu
	@ValidCharacters VARCHAR(255) -- dozwolone znaki
AS
BEGIN

DECLARE @RandomID VARCHAR(MAX) -- Zwracany napisy
DECLARE @counter SMALLINT -- licznik do pętli
DECLARE @RandomNumber FLOAT -- losowa liczba
DECLARE @RandomNumberInt TINYINT -- losowa liczba po konwersji
DECLARE @CurrentCharacter VARCHAR(1) -- obecny wylsowany znak
DECLARE @ValidCharactersLength INT -- długość poprawnych znaków
SET @ValidCharactersLength = LEN(@ValidCharacters)
SET @CurrentCharacter = ''
SET @RandomNumber = 0
SET @RandomNumberInt = 0
SET @RandomID = ''

SET NOCOUNT ON

SET @counter = 1

WHILE @counter < (@Lenght + 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
END

Losuję liczbę za pomocą funkcji losującej dostępnej w SQL Server. Tę losową liczbę ułamkową w zakresie od 0 do 1 konwertuję na liczbę całkowitą za pomocą odpowiedniego wzoru. Wybranie losowego znaku polega tak naprawdę na wycięciu napisu z dozwolonymi znakami, który podał użytkownik.

Cały proces wykonuje się pętli While, która w ten sposób tworzy napis z losowych znaków.

image

 

Procedura przyjmuje dwa parametry “długość napisu” i “dozwolone znaki” dając elastyczne rozwiązanie, które można dostosować do różnych potrzeb.

image