Sprytne (i szybkie) wygenerowanie tabeli z liczbami od 1 do N (tally table)

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'

 

POST PIERWOTNIE OPUBLIKOWANY JAKO TSQL NA DZIŚ #15

Dodaj komentarz