Función de aplicación cruzada ejecutándose para siempre
Frecuentes
Visto 347 veces
1
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,
1 Respuestas
2
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 sql sql-server tsql or haz tu propia pregunta.
¿Te equivocaste? Este es un servidor sql en lugar de mysql .. - Alex K.
¿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. - Torben Koch Pløen¿Qué pasa si solo llamas?
SELECT dbo.explodeDates('2004-01-04', '2004-02-03)
? ¿Qué pasa si lo cambias aSELECT dbo.explodeDates('2004-04-01', '2004-03-02)
? - Lieven Keersmaekers@AlexK. No lo etiqueté mysql - Johnyy
@TorbenRahbekKoch Soy consciente de eso, ese es mi propósito. - Johnyy