Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Erhalten Sie einen zufälligen Wert aus einem Bereich 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

BEARBEITEN

Diese Abfrage funktioniert durch Generieren der vollständigen Liste möglicher Nummern aus einer Systemtabelle (master.dbo.spt_values ), die garantiert mehr als 1000 Zeilen innerhalb des CTE rnCTE enthält . -1 wird zu ROW_NUMBER hinzugefügt um die Werte bei 0 statt bei 1 beginnen zu lassen.

Die äußere Abfrage füllt die Zahlen für die Anzeige mit Nullen auf und gibt nur diejenigen zurück, die nicht in den Quelldaten enthalten und kleiner als 1000 sind.