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'

