He creado la función SQL para obtener fechas en mi vista de cuadrícula, por lo que estoy pasando la fecha de inicio y la fecha de finalización a mi función, pero obtengo un error como el siguiente.

The maximum recursion 100 has been exhausted before statement completion

Si la fecha de conteo mayor a 100 significa obtener el error anterior, si la fecha por debajo de 100 significa no obtener ningún error. Tengo registros de más de 100 días.

A continuación se muestra mi lógica de datos.

 public DataTable GetDates(DateTime StartDate, DateTime EndDate)
  {
    DataTable dt = new DataTable();// order by dt desc
    ConnectMethod();
    cmd = new SqlCommand("select dt from dbo.ExplodeDates(@StartDate,@EndDate) order by dt desc", con);
    try
    {
        cmd.CommandType = CommandType.Text;
        cmd.Parameters.AddWithValue("@StartDate", StartDate);
        cmd.Parameters.AddWithValue("@EndDate", EndDate);
        cmd.ExecuteScalar();
        SqlDataAdapter da = new SqlDataAdapter(cmd);

        da.Fill(dt);
        return dt;
    }
    catch (Exception ex)
    { return dt; }
    finally
    {
        con.Close();
        con.Dispose();
        cmd.Dispose();
    }
} 

Recibo este error en cmd.ExecuteScalar (); línea. A continuación se muestra mi función SQL.

  CREATE FUNCTION [dbo].[ExplodeDates](
    @startdate datetime
    , @enddate datetime
   )
  RETURNS TABLE
  AS
  RETURN
    WITH DATES AS(
            SELECT @startdate AS dt
            UNION ALL
            SELECT DATEADD(D, 1, dt) FROM DATES WHERE DT<@enddate
    )
    SELECT * FROM DATES

     GO

Por favor, ayuda a resolver este problema buscando resultados desde la mañana.

0
mazhar 124 4 abr. 2017 a las 18:12

2 respuestas

La mejor respuesta

Puede evitar el CTE recursivo con una simple tally-table-on-the-fly :

DECLARE @NumberOfDays INT=200;
DECLARE @StartDate DATE=GETDATE();

WITH Numbers AS
(SELECT TOP (@NumberOfDays) ROW_NUMBER() OVER(ORDER BY (SELECT NULL))-1 AS Nmbr FROM master..spt_values)
SELECT DATEADD(DAY,Nmbr,@StartDate)
FROM Numbers 

master..spt_values debe contener suficientes filas (~ 2500) para asegurar 200 filas de vuelta. Puede ampliar fácilmente este número utilizando CROSS JOIN master..spt_values AS v2, lo que permitiría números bastante grandes ... (más de 6 millones)

ACTUALIZACIÓN: una función

   CREATE FUNCTION [dbo].[ExplodeDates]
   (
      @startdate datetime
    , @enddate datetime
   )
  RETURNS TABLE
  AS
  RETURN
    WITH Numbers AS
    (SELECT TOP (DATEDIFF(DAY,@startdate,@enddate)+1) ROW_NUMBER() OVER(ORDER BY (SELECT NULL))-1 AS Nmbr FROM master..spt_values)
    SELECT DATEADD(DAY,Nmbr,@startdate) AS dt
    FROM Numbers;
  GO

  SELECT * FROM dbo.ExplodeDates({d'2017-03-01'},GETDATE());
2
Community 20 jun. 2020 a las 09:12

Debe agregar la opción maximum recursion después de su tabla de selección. Me gusta :

from DATES
option (maxrecursion 0)
0
anoop 4 abr. 2017 a las 15:16