Das ist einfach :D. Häng hinter das "Order BY NAME" noch "option (maxrecursion 0)" daran. Damit wir die maximale Rekursionstiefe auf unendlich gesetzt.
Siehe dazu auch: http://books.google.de/books?id=Z1_ZQnpa12UC&pg=PA379&lpg=PA379&dq=CTE+Rekursionstiefe&source=bl&ots=jMeScAbNli&sig=7iKWeSxCU5_5SlQOxl21GOWMKyM&hl=de&ei=J8O_Tc-2LsTrsgbB_KXDBQ&sa=X&oi=book_result&ct=result&resnum=2&ved=0CBwQ6AEwAQ#v=onepage&q=CTE%20Rekursionstiefe&f=false (Das SQL Server 2005-Entwicklerbuch - Von Bob Beauchemin,Dan Sullivan)
Interessant ist insbesondere auch die Möglichkeit einer Duplizierung zwischen Intervallen:
WITH THierarchy (ID, GültigVon,GültigBis, GültigImJahr) AS ( SELECT M.ID,M.GültigVon,M.GültigBis, YEAR(M.GültigVon) GültigImJahr FROM dbo.someTable AS M
UNION ALL SELECT M.ID,M.GültigVon,M.GültigBis, th.GültigImJahr+1 GültigImJahr FROM dbo.someTable AS M
INNER JOIN THierarchy th ON th.GültigImJahr<YEAR(M.GültigBis) AND M.ID = th.ID )
SELECT ID,GültigVon,GültigBis, GültigImJahr FROM THierarchy ORDER BY ID,GültigImJahr
-- ============================================= -- Author: Hilke, Dominik -- Create date: 11.3.2011 -- Description: <Description,,> -- ============================================= CREATE FUNCTION [dbo].[RowExplode] ( -- Add the parameters for the function here @Number int ) RETURNS @exploded TABLE (Rownumber int)
AS BEGIN DECLARE @i int;
SET @i=0; WHILE @i<@Number BEGIN SET @i=@i+1 INSERT INTO @exploded (Rownumber) VALUES (@i) END RETURN END
GO
Anschließend Die Tabelle so abfragen:
SELECT TOP (100) PERCENT T.Name, T.Anzahl, r.RowNumber FROM dbo.Tabelle T CROSS APPLY dbo.RowExplode(ISNULL(T.Anzahl, 0)) r
du brauchst auf alle fälle eine hilfstabelle, da gibts in t-sql sicher einen besseren weg als irgendeine tabelle zu nehmen. in oracle z.b. würde ich eine solche tabelle mittels der connect by prior klausel konstruieren.
Ansonsten super :)