none
Variables en consultas sql server RRS feed

  • Pregunta

  • USE PLANING

    DECLARE @HORAINICIO DATETIME; DECLARE @HORAFINAL DATETIME; DECLARE @LINEA INT; SET @HORAINICIO ='20170403'; SET @HORAFINAL ='20170428'; SET @LINEA = 103; select Id,Nodo,Coche,ViajeLinea,OrdenViaje,HoraTeorica,HoraReferencia,HoraLlegada,HoraSalida, case when HoraSalida = 0 then '0' else HoraSalida end as H_REAL, CASE WHEN HoraSalida-(select s1.Horasalida from SmartCalculoPuntoaPuntoes s1 where s1.Id=s.id-1)< 0 THEN 0 ELSE HoraSalida-(select s1.Horasalida from SmartCalculoPuntoaPuntoes s1 where s1.Id=s.id-1) END AS T_VIAJE , (SELECT FLOOR (HoraSalida/60)) H_PASO INTO @LINEA from SmartCalculoPuntoaPuntoes s where ViajeLinea <> 0 and Fecha BETWEEN @HORAINICIO AND @HORAFINAL and Línea = @LINEA order by Id

    Buen dia estoy tratando de que al ejecutarse el anterior query se cree una tabla pero con el valor de la variable @Linea no hice esta prueba pero me sale error. alguien puede ayudarme por fa 
    martes, 18 de julio de 2017 20:58

Respuestas

  • Si es posible pero debes considerar dos cosas:

    - El identificador 103 no es válido porque atenta contra la regla de los identificadores, por tanto debes delimitar el identificador mediante corchetes [], por ejemplo: SELECT * FROM [103]

    - La instrucción SELECT INTO no espera por una variable, por tanto debes concatenar en una cadena las instrucciones sql necesarias para cumplir con lo que requieres y luego intentar ejecutar las instrucciones mediante el procedimiento almacenado sp_executesql.

    USE PLANING;
    
    DECLARE @FechaInicio date = '20170403';
    DECLARE @FechaFin date = '20170428';
    DECLARE @Linea int = 103;
    DECLARE @ConsultaSQL nvarchar(4000) = N'
        SELECT 
    	   Id, Nodo, Coche, ViajeLinea, OrdenViaje, HoraTeorica, HoraReferencia, 
    	   HoraLlegada, HoraSalida,
    	   CASE 
    		  WHEN HoraSalida - LAG(Horasalida, 1, Horasalida) OVER(ORDER BY Id) < 0 THEN 0 
    		  ELSE HoraSalida - LAG(Horasalida, 1, Horasalida) OVER(ORDER BY Id) 
    	   END AS T_VIAJE,
    	   FLOOR(HoraSalida / 60) H_PASO
        INTO ' + QUOTENAME(@Linea) +
        'FROM 
    	   SmartCalculoPuntoaPuntoes s    
        WHERE 
    	   ViajeLinea <> 0 AND Fecha BETWEEN @FechaInicio AND @FechaFin AND Línea = @Linea
        ORDER BY Id;'
    
    --Revisar la consulta sql generada
    --SELECT @ConsultaSQL
    
    EXECUTE sp_executesql @ConsultaSQL, 
        N'FechaInicio date, @FechaFin date, @Linea int', @FechaInicio, @FechaFin, @Linea
    
    --Probar resultados
    SELECT * FROM [103];
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta MC BAMBAM martes, 18 de julio de 2017 23:21
    martes, 18 de julio de 2017 22:43

Todas las respuestas

  • Hola Wiliam Morales , gracias por tu interés y colaboración, mira lo que quiero hacer que que después de ejecutarse la consulta se cree una tabla con los resultados de la consulta, pero quiero que esa tabla quede con un nombre asignado a una variable @LINEA, EN mi ejemplo @LINEA guarda el valor de '103' así debería llamarse la tabla. esa es la forma como lo estoy haciendo No se si a exista  un mejor camino . Mil gracias
    martes, 18 de julio de 2017 21:54
  • Si es posible pero debes considerar dos cosas:

    - El identificador 103 no es válido porque atenta contra la regla de los identificadores, por tanto debes delimitar el identificador mediante corchetes [], por ejemplo: SELECT * FROM [103]

    - La instrucción SELECT INTO no espera por una variable, por tanto debes concatenar en una cadena las instrucciones sql necesarias para cumplir con lo que requieres y luego intentar ejecutar las instrucciones mediante el procedimiento almacenado sp_executesql.

    USE PLANING;
    
    DECLARE @FechaInicio date = '20170403';
    DECLARE @FechaFin date = '20170428';
    DECLARE @Linea int = 103;
    DECLARE @ConsultaSQL nvarchar(4000) = N'
        SELECT 
    	   Id, Nodo, Coche, ViajeLinea, OrdenViaje, HoraTeorica, HoraReferencia, 
    	   HoraLlegada, HoraSalida,
    	   CASE 
    		  WHEN HoraSalida - LAG(Horasalida, 1, Horasalida) OVER(ORDER BY Id) < 0 THEN 0 
    		  ELSE HoraSalida - LAG(Horasalida, 1, Horasalida) OVER(ORDER BY Id) 
    	   END AS T_VIAJE,
    	   FLOOR(HoraSalida / 60) H_PASO
        INTO ' + QUOTENAME(@Linea) +
        'FROM 
    	   SmartCalculoPuntoaPuntoes s    
        WHERE 
    	   ViajeLinea <> 0 AND Fecha BETWEEN @FechaInicio AND @FechaFin AND Línea = @Linea
        ORDER BY Id;'
    
    --Revisar la consulta sql generada
    --SELECT @ConsultaSQL
    
    EXECUTE sp_executesql @ConsultaSQL, 
        N'FechaInicio date, @FechaFin date, @Linea int', @FechaInicio, @FechaFin, @Linea
    
    --Probar resultados
    SELECT * FROM [103];
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta MC BAMBAM martes, 18 de julio de 2017 23:21
    martes, 18 de julio de 2017 22:43
  • Gracias por tu aporte funciono perfectamente, bendiciones un abrazo 
    martes, 18 de julio de 2017 23:21