peperomero:
In un post che avevo aperto qui http://www.dotnethell.it/Forum/messages.aspx?ThreadID=18065 mi è stata suggerita una funzione ricorsiva che devo dire funziona perfettamente, ma quando i dati rischiesti cominciano ad essere tanti allora mi dice che non puo effettuare piu di 100 ricorsioni nidificate. Dato che i dati che devo poter estrarre possono riguardare anche lunghi periodi temporali ho dovuto scartare questa soluzione.
Ciao Luca,
Mi sembra di conoscere la persona che ti ha suggerito l'utilizzo delle CTE 
E' vero, di default le CTE ricorsive permettono al più 100 ricorsioni, ma nulla ti vieta di specificare l'hint MAXRECURSION che permette di raggiungere 32767 ricorsioni.
I Books Online riportano:
MAXRECURSION number
Specifies the maximum number of recursions allowed for this query. number is a nonnegative integer between 0 and 32767. When 0 is specified, no limit is applied. If this option is not specified, the default limit for the server is 100.
When the specified or default number for MAXRECURSION limit is reached during query execution, the query is ended and an error is returned.
Because of this error, all effects of the statement are rolled back. If the statement is a SELECT statement, partial results or no results may be returned. Any partial results returned may not include all rows on recursion levels beyond the specified maximum recursion level.
Ho provato a modificare l'UDF che ti avevo suggerito, ma SQL rilancia un errore di compilazione:
CREATE FUNCTION dbo.udf_GetInterval(
@Interval smallint = 1
)
RETURNS TABLE
AS
RETURN (
WITH CTE_GetInterval AS
(
/* Anchor Member */
SELECT *
FROM dbo.myData
WHERE DataID = 1
UNION ALL
/* Recursive Member */
SELECT D.*
FROM dbo.myData AS D
JOIN CTE_GetInterval AS CTE
ON D.Date = DATEADD(minute, @Interval, CTE.Date)
)
SELECT *
FROM CTE_GetInterval
OPTION (MAXRECURSION 0)
);
GO
/* Output:
Msg 156, Level 15, State 1, Procedure udf_GetInterval, Line 25
Incorrect syntax near the keyword 'OPTION'.
*/
Sinceramente non ti so spiegare la causa (la CTE non ha problemi), così ho pensato di incapsularla in una stored procedure:
CREATE PROCEDURE dbo.up_GetInterval(
@Interval smallint = 1
)
AS
WITH CTE_GetInterval AS
(
/* Anchor Member */
SELECT *
FROM dbo.myData
WHERE DataID = 1
UNION ALL
/* Recursive Member */
SELECT D.*
FROM dbo.myData AS D
JOIN CTE_GetInterval AS CTE
ON D.Date = DATEADD(minute, @Interval, CTE.Date)
)
SELECT *
FROM CTE_GetInterval
OPTION (MAXRECURSION 0);
GO
EXEC dbo.up_GetInterval 5;
/* Output:
DataID Date
----------- -----------------------
1 2007-06-01 10:00:00.000
6 2007-06-01 10:05:00.000
11 2007-06-01 10:10:00.000
16 2007-06-01 10:15:00.000
(4 row(s) affected)
*/
Per quanto riguarda i problemi di performance, definisci un indice clustered sulla colonna Date.
Ciao!