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