[SQL RANDOM] RAND() Generar cadenas aleatorias.


Saludos nuevamente amigos, supongo que en varias ocasiones han intentado generar cadenas aleatorias en SQL, ya sea que contengan caracteres, números o ambos, bueno pues me encontré algunos ejemplos de como hacer una función en SQL para lograr nuestro objetivo de la forma más eficiente.

Les dejo un script de una función escalar la cual recibe dos parámetros, uno para el tamaño de la cadena aleatoria y el segundo para seleccionar si se requieren números, letras o ambos.

Vale la pena comentarles que se requiere crear una vista “VIEW” para poder hacer uso de la función RAND(), ya que no es valido su uso dentro de una función escalar, si lo intentan hacer las marcara el siguiente error.

image

Para que no suceda esto crearemos una vista:

CREATE VIEW vwRandom
AS
SELECT RAND() as Rnd
GO 

 

Aquí esta el script de la función (vean la parte donde se utiliza la vista vwRandom para no generar un error):

CREATE FUNCTION fnCustomPass 
(    
    @size AS INT, --Tamaño de la cadena aleatoria
    @op AS VARCHAR(2) --Opción para letras(ABC..), numeros(123...) o ambos.
)
RETURNS VARCHAR(62)
AS
BEGIN    

    DECLARE @chars AS VARCHAR(52),
            @numbers AS VARCHAR(10),
            @strChars AS VARCHAR(62),        
            @strPass AS VARCHAR(62),
            @index AS INT,
            @cont AS INT

    SET @strPass = ''
    SET @strChars = ''    
    SET @chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    SET @numbers = '0123456789'

    SET @strChars = CASE @op WHEN 'C' THEN @chars --Letras
                        WHEN 'N' THEN @numbers --Números
                        WHEN 'CN' THEN @chars + @numbers --Ambos (Letras y Números)
                        ELSE '------'
                    END

    SET @cont = 0
    WHILE @cont < @size
    BEGIN
        SET @index = ceiling( ( SELECT rnd FROM vwRandom ) * (len(@strChars)))--Uso de la vista para el Rand() y no generar error.
        SET @strPass = @strPass + substring(@strChars, @index, 1)
        SET @cont = @cont + 1
    END    
        
    RETURN @strPass

END
GO

Ahora solo nos falta ejecutar la función y ver cuales son los resultados que nos genera:

SELECT dbo.fnCustomPass(15,'C') AS 'Cadena aleatoria','Solo Letras' AS Contiene  --Cadena aleatoria que contiene Letras.
UNION ALL
SELECT dbo.fnCustomPass(15,'N'),'Solo Números'  --Cadena aleatoria que contiene Números.
UNION ALL
SELECT dbo.fnCustomPass(15,'CN'), 'Letras y Números'--Cadena aleatoria que contiene Letras y Números.

Resultado:

image

Espero les sea de ayuda, dejen comentarios o escriban si necesitan ayuda sobre algún tema.

    • iEspiro
    • 11/10/11

    gracias fuie de mucha utilidad

  1. me hiciste el dia man!

    • Gloria
    • 12/04/12

    De mucha utilidad

    • JcQuark
    • 2/05/12

    Buenisima

    • hugo
    • 15/10/12

    excelente
    gracias!!!!!

  2. Buen Post, Gracias es de mucha utilidad

    • Cesar
    • 27/04/16

    Muchas gracias, me sirvió mucho

  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: