Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Uzyskać losową wartość z zakresu w 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

EDYTUJ

To zapytanie działa poprzez generowanie pełnej listy możliwych liczb z tabeli systemowej (master.dbo.spt_values ), który gwarantuje, że zawiera więcej niż 1000 wierszy wewnątrz CTE rnCTE . -1 został dodany do ROW_NUMBER aby wartości zaczynały się od 0, a nie od 1.

Zewnętrzne zapytanie zero wypełnia liczby do wyświetlenia, zwracając tylko te, które nie znajdują się w danych źródłowych i są mniejsze niż 1000.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2008 XPath

  2. lista rozdzielana przecinkami jako pojedynczy ciąg, T-SQL

  3. Pobierz ostatni wiersz wstawiony z Uniqueidentifier, który nie jest TOŻSAMOŚCIĄ

  4. Czy w tsql wstawka z instrukcją Select jest bezpieczna pod względem współbieżności?

  5. Ustaw część czasową zmiennej datetime