none
Vista de poco uso no funciona correctamente RRS feed

  • Pregunta

  • Tengo un sistema que trabaja con SQL Server 2014 y hay un proceso que solo se realiza 1 o 2 veces al año es decir no es muy utilizado lo raro es que la ultima ves que utilice este proceso no tenia problema alguno pero ahora de la nada comenzó a tener problema con una vista que se supone debe de calcular el total de cada documento de venta.

    Este es el código  de la vista

    ALTER VIEW [dbo].[vVenta_Con_Total]
    AS
    select v.*
    ,vt.Total Total_Venta
    from tbVentas v 
    left join(
    SELECT 
    v.Vent_Cod
    ,SUM(
    CASE dbo.TRIM(v.Moneda) 
    WHEN 'Soles' THEN ROUND(vd.Precio_S * vd.Cantidades, 4) 
    WHEN 'Dolares' THEN ROUND(vd.Precio_D * vd.Cantidades, 4) 
    END
    ) AS Total
    FROM dbo.tbVentas v
    LEFT JOIN dbo.tbVentas_Det vd ON v.Vent_Cod = vd.Vent_Cod
    GROUP BY v.Vent_Cod) VT on v.Vent_Cod=vt.Vent_Cod
    GO

    Como pueden ver la consulta realiza un sub consulta para calcular el total de cada venta el problema esta en que en ves de calcular el total de la venta da como resultado 1 y mas extraño a un después de revisar el código y darme cuenta de que no tiene nada y que todo esta bien, volví a ejecutar el código mas que nada por reflejo que por querer probar algo, y la vista comienza a trabajar bien, es decir es como si SQL server hubiera perdido parte del código de la vista y al volverla a crear se repara, no hice ningún cambio en el código de la vista y esta volvió a funcionar con solo volverla a ejecutar, como tengo backups diarios y no creía lo que estaba pasando  volví a cargar el backup en una BD diferente y volvió a pasar lo mismo.

    En resumen no entiendo y me genera mucha desconfianza que una vista se comporte de esta manera sin que nadie la aya modificado y me cuestiona el uso de vistas en sql server pues siempre creí que era mejor crear una vista que una consulta directa tengo cerca de 100 vistas creadas y ahora no se si estas vistas están bien y como asegurarme que estén haciendo bien su trabajo

     

    jueves, 10 de enero de 2019 14:37

Respuestas

  • Te doy una posible explicación de por qué puede comportarse así: Has usado un asterisco en la definición de los campos de la vista. Cuando haces esto, el problema es que si después de crear la vista se modifican los campos de la tabla (cosa que ha podido pasar si hace meses que no usas la vista), entonces la vista NO se adapta a los nuevos campos de la tabla, sino que sigue sirviendo los campos en el orden antiguo, con lo que puede que un campo de la vista que tenga un cierto nombre no devuelva la columna de la tabla que tiene el mismo nombre, sino otra columna distinta. Esto te destroza todos los cálculos que hagas con los campos de la vista.

    Si vuelves a salvar la vista, se arregla el problema porque vuelve a "emparejarse" con la tabla. Seguramente por eso te funcionó cuando volviste a ejecutar el código.

    El remedio para no volver a tener el problema en el futuro es no usar el asterisco en la definición de los campos de la vista. Acostúmbrate a crear las vistas escribiendo siempre la lista completa de todos los campos que se necesita utilizar.

    jueves, 10 de enero de 2019 15:15
  • Tienes toda la razón ese es el problema lo verifique en mi base de datos de prueba alterando la tabla de venta una ves alterada la vista no funciona no realiza correctamente el calculo hasta que la vuelves a crear y se soluciona.

    Pero este es un bug porque el sistema debería de actualizarse automáticamente esa tabla tiene 45 campos y obviamente el * es para evitar escribir todos 

    Bueno tendré mas cuidado con las vistas y el * muchas gracias por la ayuda

    viernes, 11 de enero de 2019 17:12
  • Para hacer las cosas mas rápido lo que hice es crear con el Generador de script y volver a generar todas las vistas de este modo sin mucha demora refresco todas las vistas solo tengo que recordar hacerlo cada ves que modifico una tabla
    viernes, 11 de enero de 2019 17:49

Todas las respuestas

  • Te doy una posible explicación de por qué puede comportarse así: Has usado un asterisco en la definición de los campos de la vista. Cuando haces esto, el problema es que si después de crear la vista se modifican los campos de la tabla (cosa que ha podido pasar si hace meses que no usas la vista), entonces la vista NO se adapta a los nuevos campos de la tabla, sino que sigue sirviendo los campos en el orden antiguo, con lo que puede que un campo de la vista que tenga un cierto nombre no devuelva la columna de la tabla que tiene el mismo nombre, sino otra columna distinta. Esto te destroza todos los cálculos que hagas con los campos de la vista.

    Si vuelves a salvar la vista, se arregla el problema porque vuelve a "emparejarse" con la tabla. Seguramente por eso te funcionó cuando volviste a ejecutar el código.

    El remedio para no volver a tener el problema en el futuro es no usar el asterisco en la definición de los campos de la vista. Acostúmbrate a crear las vistas escribiendo siempre la lista completa de todos los campos que se necesita utilizar.

    jueves, 10 de enero de 2019 15:15
  • Es interesante la situación que planteas, aunque la unica forma que tienes de verificar que efectivamente se ha modificado es a través de un control, en este caso te puede venir bien la definición de un trigger a nivel de Database DDL, puedes encontrar mas información en estos enlaces:

    https://docs.microsoft.com/es-es/sql/relational-databases/triggers/ddl-triggers?view=sql-server-2017


    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    • Propuesto como respuesta Pedro Alfaro jueves, 10 de enero de 2019 19:51
    jueves, 10 de enero de 2019 15:24
  • Tienes toda la razón ese es el problema lo verifique en mi base de datos de prueba alterando la tabla de venta una ves alterada la vista no funciona no realiza correctamente el calculo hasta que la vuelves a crear y se soluciona.

    Pero este es un bug porque el sistema debería de actualizarse automáticamente esa tabla tiene 45 campos y obviamente el * es para evitar escribir todos 

    Bueno tendré mas cuidado con las vistas y el * muchas gracias por la ayuda

    viernes, 11 de enero de 2019 17:12
  • Para hacer las cosas mas rápido lo que hice es crear con el Generador de script y volver a generar todas las vistas de este modo sin mucha demora refresco todas las vistas solo tengo que recordar hacerlo cada ves que modifico una tabla
    viernes, 11 de enero de 2019 17:49
  •  esa tabla tiene 45 campos y obviamente el * es para evitar escribir todos 

    Hay un truco para esto: En SSMS haz click derecho sobre la tabla y selecciona la opción de "Generar Scripts". Después, en el script copia con el ratón la lista de campos, y la pegas directamente sobre la definición de la vista. No es igual de cómodo que escribir un asterisco, pero sí es mucho más rápido (y genera menos errores) que escribir a mano la lista de campos.
    viernes, 11 de enero de 2019 17:52