Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Obtenir une valeur aléatoire à partir d'une plage dans MS SQL ?

DECLARE @t TABLE
(VALUE CHAR(3))

INSERT @t
VALUES
('000'),('002'),('005'),('190')


;WITH rnCTE
AS
(
    SELECT -1 + ROW_NUMBER() OVER (ORDER BY TYPE, number, name) AS rn
    FROM master.dbo.spt_values
)
SELECT RIGHT('000' + CAST( rn AS VARCHAR(11)),3)
FROM rnCTE
WHERE NOT EXISTS    (   SELECT 1 FROM @t 
                        WHERE VALUE = rn
                    )
AND rn < 1000

MODIFIER

Cette requête fonctionne en générant la liste complète des nombres possibles à partir d'une table système (master.dbo.spt_values ) qui est garanti pour contenir plus de 1000 lignes à l'intérieur du CTE rnCTE . -1 est ajouté à ROW_NUMBER pour que les valeurs commencent à 0 plutôt qu'à 1.

La requête externe remplit de zéros les nombres pour l'affichage, renvoyant uniquement ceux qui ne sont pas dans les données source et sont inférieurs à 1 000.