Générer la série SQLServer 2005

/* SqlServer 2005 Standard */
CREATE FUNCTION [dbo].[generate_series] ( 
    @BeginData datetime, 
    @EndDate datetime, 
    @DatePart varchar(32) = '1 day'
 )
RETURNS @Serie TABLE ( item datetime ) AS BEGIN
   declare @arg varchar(32); 
   declare @len integer; 
   declare @pos integer; 
    
   declare @Data datetime;
   declare @DatePartType varchar(11);
   declare @DatePartIncrement integer;
    
   SET @arg = lTRIM(rTRIM(@DatePart));
   SET @pos = CHARINDEX(' ', @arg );
   SET @len = LEN(@arg);
   SET @DatePartIncrement = CAST(LEFT(@arg, @pos) as integer);
   SET @DatePartType = lower(RIGHT(@arg, @len - @pos));
   SET @Data = @BeginData;

   WHILE (@Data <= @EndDate) 
   BEGIN
      INSERT INTO @Serie(item) VALUES( @Data );
      SET @Data = CASE @DatePartType 
      WHEN 'year'        THEN dateadd(year,        @DatePartIncrement, @Data )
      WHEN 'quarter'     THEN dateadd(quarter,     @DatePartIncrement, @Data )
      WHEN 'month'       THEN dateadd(month,       @DatePartIncrement, @Data )
      WHEN 'day'         THEN dateadd(day,         @DatePartIncrement, @Data )
      WHEN 'week'        THEN dateadd(week,        @DatePartIncrement, @Data )
      WHEN 'weekday'     THEN dateadd(weekday,     @DatePartIncrement, @Data )
      WHEN 'hour'        THEN dateadd(hour,        @DatePartIncrement, @Data )
      WHEN 'minute'      THEN dateadd(minute,      @DatePartIncrement, @Data )
      WHEN 'second'      THEN dateadd(second,      @DatePartIncrement, @Data )
      ELSE dateadd( day, @DatePartIncrement, @Data ) END                         
   END;   
   
   RETURN
   -- SELECT * FROM vw_generate_series_TEST
END
/* View de Tests */
ALTER VIEW vw_generate_series_TEST AS
SELECT 
    1 as Test, 
    '2001-01-01 00:00:00.000' as BeginDateArg, 
    '2010-12-31 00:00:00.000' as EndDateArg, 
    '1 year       ' as DatePartArg, 
    10   OK, 
    Count(*) QT, 
    CASE WHEN (10  =Count(*)) THEN '  OK  ' ELSE 'FALHOU' END Status 
FROM lib.dbo.generate_series('2001-01-01 00:00:00.000', '2010-12-31 00:00:00.000', '1 year       ') 
union
SELECT 
    2 as Test, 
    '2010-01-01 00:00:00.000' as BeginDateArg, 
    '2010-12-31 00:00:00.000' as EndDateArg, 
    '1 quarter    ' as DatePartArg,  
    4   OK, 
    Count(*) QT, 
    CASE WHEN ( 4  =Count(*)) THEN '  OK  ' ELSE 'FALHOU' END Status 
FROM lib.dbo.generate_series('2010-01-01 00:00:00.000', '2010-12-31 00:00:00.000', '1 quarter    ') 
union
SELECT 
    3 as Test, 
    '2010-01-01 00:00:00.000' as BeginDateArg, 
    '2010-12-31 00:00:00.000' as EndDateArg, 
    '1 month      ' as DatePartArg, 
    12   OK, 
    Count(*) QT, 
    CASE WHEN (12  =Count(*)) THEN '  OK  ' ELSE 'FALHOU' END Status 
FROM lib.dbo.generate_series('2010-01-01 00:00:00.000', '2010-12-31 00:00:00.000', '1 month      ') 
union
SELECT 
    4 as Test, 
    '2010-01-01 00:00:00.000' as BeginDateArg, 
    '2010-01-31 00:00:00.000' as EndDateArg, 
    '1 day        ' as DatePartArg, 
    31   OK, 
    Count(*) QT, 
    CASE WHEN (31  =Count(*)) THEN '  OK  ' ELSE 'FALHOU' END Status 
FROM lib.dbo.generate_series('2010-01-01 00:00:00.000', '2010-01-31 00:00:00.000', '1 day        ') 
union
SELECT 
    5 as Test, 
    '2010-01-01 00:00:00.000' as BeginDateArg, 
    '2010-01-31 00:00:00.000' as EndDateArg, 
    '1 week       ' as DatePartArg, 
    5    OK, 
    Count(*) QT, 
    CASE WHEN (5   =Count(*)) THEN '  OK  ' ELSE 'FALHOU' END Status 
FROM lib.dbo.generate_series('2010-01-01 00:00:00.000', '2010-01-31 00:00:00.000', '1 week    ') 
union
SELECT 
    6 as Test, 
    '2010-01-01 00:00:00.000' as BeginDateArg, 
    '2010-01-01 23:59:59.000' as EndDateArg, 
    '1 hour       ' as DatePartArg, 
    24   OK, 
    Count(*) QT, 
    CASE WHEN (24  =Count(*)) THEN '  OK  ' ELSE 'FALHOU' END Status 
FROM lib.dbo.generate_series('2010-01-01 00:00:00.000', '2010-01-01 23:59:59.000', '1 hour       ') 
union
SELECT 
    7 as Test, 
    '2010-01-01 23:00:00.000' as BeginDateArg, 
    '2010-01-01 23:59:59.000' as EndDateArg, 
    '1 minute     ' as DatePartArg, 
    60   OK, 
    Count(*) QT, 
    CASE WHEN (60  =Count(*)) THEN '  OK  ' ELSE 'FALHOU' END Status 
FROM lib.dbo.generate_series('2010-01-01 23:00:00.000', '2010-01-01 23:59:59.000', '1 minute     ') 
union
SELECT 
    8 as Test, 
    '2010-01-01 23:00:01.000' as BeginDateArg, 
    '2010-01-01 23:01:00.000' as EndDateArg, 
    '1 second     ' as DatePartArg, 
    60   OK, 
    Count(*) QT, 
    CASE WHEN (60  =Count(*)) THEN '  OK  ' ELSE 'FALHOU' END Status 
FROM lib.dbo.generate_series('2010-01-01 23:00:01.000', '2010-01-01 23:01:00.000', '1 second     ')
Luis Alfredo G Caldas Neto