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

Wybór N wierszy w SQL Server

Jak skomentowano wcześniej, dzieje się tak, ponieważ osiągnąłeś liczbę wierszy sys.columns . Oto inny sposób generowania listy liczb lub tego, co inni nazywają Numbers Table lub Tally Table .

Używa kaskadowego CTE s i mówi się, że jest to najszybszy sposób na utworzenie tabeli Tally:

DECLARE @Range AS INT = 7374

;WITH E1(N) AS( -- 10 ^ 1 = 10 rows
    SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N)
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows
E8(N) AS(SELECT 1 FROM E4 a CROSS JOIN E4 b), -- 10 ^ 8 = 10,000,000 rows
CteTally(N) AS(
    SELECT TOP(@Range) ROW_NUMBER() OVER(ORDER BY(SELECT NULL))
    FROM E8
)
SELECT * FROM CteTally

Możesz łatwo dodać kolejne CTE, jeśli potrzebujesz więcej niż 10 000 wierszy.

Aby uzyskać więcej informacji o tabeli Tally, przeczytaj ten doskonały artykuł autorstwa Jeffa Modena.

Aby porównać wydajność między sposobami generowania tabel z danymi, przeczytaj to .

Wyjaśnienie zaczerpnięte z artykułu Jeffa:

CTE o nazwie E1 (jak w 10E1 dla notacji naukowej) to nic więcej niż dziesięć SELECT 1 jest zwracany jako pojedynczy zestaw wyników.

E2 wykonuje CROSS JOIN z E1 z samym sobą. To zwraca pojedynczy zestaw wyników składający się z 10*10 lub do 100 wierszy. Mówię „do”, ponieważ jeśli funkcja TOP wynosi 100 lub mniej, CTE są wystarczająco „inteligentne”, aby wiedzieć, że nie trzeba iść dalej i E4 i E8 nawet nie wejdzie w grę. Jeśli TOP ma wartość mniejszą niż 100, a nie wszystkie 100 wierszy, które E2 jest w stanie sprawić, że zostanie wykonana. Zawsze wystarczy, zgodnie z TOP funkcja.

Możesz śledzić stamtąd. E4 to CROSS JOIN z E2 i zrobi do 100*100 lub 10 000 wierszy i E8 to CROSS JOIN z E4 co spowoduje więcej rzędów, niż większość ludzi kiedykolwiek będzie potrzebować. Jeśli zrobiłeś więcej, po prostu dodaj E16 jako CROSS JOIN z E8 i zmień końcowy FROM klauzula do FROM E16 .

To, co jest naprawdę niesamowite w tym złym chłopcu, to to, że produkuje ZEROREADY . Absolutnie żaden, nada, zero.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak znaleźć format daty używany w bieżącej sesji w SQL Server (T-SQL)

  2. SQL Server Zmień lokalizację pliku TempDB

  3. Jak ISNUMERIC() działa w SQL Server

  4. Sprawdź nieudane wiadomości e-mail w programie SQL Server (T-SQL)

  5. Bazy danych systemu SQL Server — podstawowe pojęcia