Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Ottieni un valore casuale da un intervallo in 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

MODIFICA

Questa query funziona generando l'elenco completo dei possibili numeri da una tabella di sistema (master.dbo.spt_values ) che è garantito per contenere più di 1000 righe all'interno del CTE rnCTE . -1 viene aggiunto a ROW_NUMBER per fare in modo che i valori inizino da 0 anziché da 1.

La query esterna azzera i numeri da visualizzare, restituendo solo quelli che non sono nei dati di origine e sono inferiori a 1000.