Función de aplicación cruzada ejecutándose para siempre

Estoy usando una aplicación cruzada en un procedimiento almacenado para expandir el rango de fechas a fechas individuales.

select *
from #tbl_tempOutPut as st
cross apply dbo.explodeDates(st.startdate,st.enddate) as dt

La tabla #tbl_tempOutPut se ve así:

ID  Des startdate   enddate     kindex      
A   att 2003-12-04  2004-01-03  1
A   att 2004-01-04  2004-02-03  1

La función dbo.explodeDates es una respuesta anterior aceptada.

Mi problema es que la consulta se ejecuta para siempre y no regresa.

Muchas gracias,

preguntado el 22 de mayo de 12 a las 17:05

¿Te equivocaste? Este es un servidor sql en lugar de mysql .. -

¿Es usted consciente de que la función dbo.explodeDates se llamará para cada fila de la tabla? Debería considerar usar SQL/CLR en su lugar, ya que probablemente funcionaría mucho mejor en un escenario como este. -

¿Qué pasa si solo llamas? SELECT dbo.explodeDates('2004-01-04', '2004-02-03)? ¿Qué pasa si lo cambias a SELECT dbo.explodeDates('2004-04-01', '2004-03-02)? -

@AlexK. No lo etiqueté mysql -

@TorbenRahbekKoch Soy consciente de eso, ese es mi propósito. -

1 Respuestas

Volver a escribir explodeDates como una función con valores de tabla en línea. Es casi seguro que esto hará una enorme diferencia.

CREATE FUNCTION dbo.explodeDates (
  @StartDate    char(10),
  @EndDate      char(10)
) RETURNS TABLE AS RETURN SELECT
  CONVERT(datetime,@StartDate)+n-1 AS [Date]
  FROM Numbers
  WHERE Number <= DATEDIFF(day,@StartDate,CONVERT(datetime,@EndDate)+1)

contestado el 22 de mayo de 12 a las 20:05

De hecho, la respuesta a la que se refiere el OP sugiere usar también un TVF en línea. - andriy m

La función explosionDates siempre es una función de valor tabulado. También usando una tabla de números, aunque la tabla se ve un poco diferente. - johnyy

@Johnyy: No estoy seguro de lo que quiere decir aquí, pero tal vez no se dé cuenta de que hay dos tipos de funciones con valores de tabla en SQL Server: declaraciones múltiples y en línea. Se manejan de manera completamente diferente, aunque no parezcan tan diferentes. Cuando se usan funciones en línea, como sugiero aquí, hay muchas más posibilidades para el optimizador. ¿Has probado la versión en línea? Creo que lo encontrarás mucho mejor. - steve kass

Creo que finalmente vi la causa de la confusión. El OP se refería a la respuesta aceptada y la función llamada dbo.explodeDates, cual is un TVF en línea. Pero su enlace se abre en una respuesta diferente, lo que sugiere una función diferente (dbo.ListDates), y esa función es un TVF de sentencias múltiples. ¿Fue por que función que decidiste publicar tu respuesta? - andriy m

andriy: si Supuse que el OP estaba vinculado a la función que estaba usando, a pesar de la diferencia en el nombre de la función. - steve kass

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.