Jeżeli potrzebowaliście kiedyś wygenerować na szybko do testów sporą ilość wierszy lub chcieliście otrzymać liczby rosnąco w postaci wierszy (joinowanie numeracji, sprawdzanie ciaglosci numeracji i inne kombinacje ;]) to istnieje sposób na stosunkowo szybkie zaspokojenie takiej potrzeby 😀
Z pomocą przychodzi nam CTE i funkcja okienkowa numerująca dane wygenerowane przez self-join’y, które zwracają olbrzymie ilości rekordów.
Poniższy przykład jest w stanie wygenerować aż 4,294,967,296 wierszy (każdy rekord zwraca wartość 0).
Metoda jest dosyć prosta i znana w świecie community sql server ;] Jej autorem jest Itzik Ben-Gan (tsql.solidq.com).
Poniżej przykład wygenerowania tempówki zawierającej 100.000.000 rekordów z liczbami od 1 do 100000000 trwający ~ 1m20sek na dość szybkim serwerze.
use tempdb GO SET STATISTICS TIME ON; WITH lv0 AS (SELECT 0 g UNION ALL SELECT 0) ,lv1 AS (SELECT 0 g FROM lv0 a CROSS JOIN lv0 b) -- 4 ,lv2 AS (SELECT 0 g FROM lv1 a CROSS JOIN lv1 b) -- 16 ,lv3 AS (SELECT 0 g FROM lv2 a CROSS JOIN lv2 b) -- 256 ,lv4 AS (SELECT 0 g FROM lv3 a CROSS JOIN lv3 b) -- 65,536 ,lv5 AS (SELECT 0 g FROM lv4 a CROSS JOIN lv4 b) -- 4,294,967,296 ,Tally (n) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM lv5) SELECT TOP (100000000) n into #big FROM Tally GO sp_spaceused '#big'