0votos

Generador de números en orden aleatorio (para practicar pruebas) en SQL

por josejuan hace 6 años

En una única sentencia SQL (usando T-SQL extendido de SQL Server). Uso la versión de ordenar aleatorio, sólo que ésta versión sí es un BUEN shufflé porque las claves aleatorias son únicas. :D

Este ejercicio es muy sencillo y es un buen ejemplo para practicar cómo escribir pruebas automáticas con herramientas XUnit. Se quiere implementar un método que permita calcular una secuencia de números aleatorios entre un rango de dos números enteros, de manera que dichos números aleatorios nunca se repitan.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
CREATE PROCEDURE dbo.f_shuffle(@n int) 
AS 
BEGIN 
    WITH R AS (SELECT n = 1, w = NewId() UNION ALL SELECT n + 1, w = NewId() FROM R WHERE n < @n) 
    SELECT n FROM R ORDER BY w 
END 
 
 
 
 
 
 
 
 
-- Lanzaremos @numTests comprobando propiedades (no test por casos). 
DECLARE @numTests int 
SET    @numTests = 1000 -- en 2 segundos probamos 1000 veces 6 propiedades 
            -- deseables de la función. 
 
WHILE @numTests > 0 
BEGIN 
SET @numTests = @numTests - 1 
 
    -- El dominio de test es cualquier nº entero, por cuestión 
    -- de rendimiento, entre 1 y 100. 
    DECLARE @n int 
    SET    @n = 1 + Convert(int, Floor(99.9999 * RAND())) 
 
    DECLARE @shuffle TABLE (n int primary key) 
 
    DELETE FROM @shuffle 
 
    -- PROPIEDAD 1: todos los valores devueltos por la función deben ser diferentes. 
    -- Se pueden lanzar un par de text muy sencillos, el primero es definir una tabla 
    -- con clave primaria, eso asegura que no se repiten los valores 
 
    -- PROPIEDAD 2: también se revisa la propiedad de que no se devuelven valores nulos. 
    INSERT INTO @shuffle 
    EXEC dbo.f_shuffle @n 
 
    -- PROPIEDAD 3: siempre se devuelven N valores 
    IF (SELECT COUNT(*) FROM @shuffle) <> @n 
        RAISERROR('ERROR, "f_shuffle" debe devolver N elementos!', 18, 0) 
 
    -- PROPIEDAD 4: el menor valor posible debe ser 1 
    IF (SELECT MIN(n) FROM @shuffle) <> 1 
        RAISERROR('ERROR, "f_shuffle" debe devolver un valor no inferior a 1!', 18, 0) 
 
    -- PROPIEDAD 5: el mayor valor posible debe ser N 
 
    -- PROPIEDAD 6: también queda revisado que se devuelven todos los elementos y sólo 
    -- los elementos entre 1 y N. 
    IF (SELECT MAX(n) FROM @shuffle) <> @n 
        RAISERROR('ERROR, "f_shuffle" debe devolver un valor no superior a N!', 18, 0) 
END 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.