none
Update RRS feed

  • Pregunta


  • Necesito hacer una actualizacion a un campo de una tabla que se llena con un sp donde ese campo lo inserto en cero en la tabla inicialmente, el update es:
    Upadate tabla1
    set campo1 = (select (tabla2.campo2*12) - ((funcion_conteo_datos_de_otra_tabla_de_otra_bd)*valor de tabla3 donde el campo tabla3.campo3 ='V')+
    (funcion_conteo_datos_de_otra_tabla_de_otra_bd)*valor de tabla3 donde el campo tabla3.campo3 ='A')+
    (funcion_conteo_datos_de_otra_tabla_de_otra_bd)*valor de tabla3 donde el campo tabla3.campo3 ='R'))

    Agradezco su ayuda, lo necesito urgente. Gracias!
    martes, 24 de abril de 2012 17:26

Respuestas

  • El problema (como mínimo) lo tienes en este from

              FROM [BD1].tabla_aten, --tabla de otra BD
                tabla_v,
                PRUEBA1_TABLA
                WHERE 
                tabla_v.tipo = tabla_aten.tipo 
                AND tabla_aten.campo1 = @campo1
                AND tabla_aten.campo2 = @campo_c

    ya que haces join de tabla_v con tabla_aten, y CROSS JOIN con Prueba1_tabl, es decir no la relacionas por lo que eso devolverá los registros que filtren tabla1 y tabla_aten( imaginemos que solo 1) multiplicados por el número de fila de prueba_1 tabla.. tabla que por cierto no usas.

    Por otra parte si esa funcion solamente hace un select... sacalo de una udf y metelo como código normal que saldrás ganando. 


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    miércoles, 25 de abril de 2012 15:07
    Moderador
  • Si, gracias!!! con un top 1.
    • Marcado como respuesta Marce_M miércoles, 9 de mayo de 2012 2:30
    miércoles, 9 de mayo de 2012 2:29

Todas las respuestas

  • es dificil darte una respuesta así.. lee este post y ayudanos a ayudarte.

    http://social.msdn.microsoft.com/Forums/es-ES/sqlserveres/thread/0783f75a-6a2f-49e6-916d-76e1f0ffdfb4



    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    martes, 24 de abril de 2012 19:51
    Moderador
  • mmm  dificil de entender y asi dificil de ayudar

    http://dbasqlserver.wordpress.com/

    martes, 24 de abril de 2012 20:51
  • Has pensado en recoger los valores de retorno de los SP en variables y después con estas hacer el UPDATE ?

    Probablemente haya soluciones mejores pero con tan poca información....

    SalU2


    JMF

    martes, 24 de abril de 2012 22:24
  • Buen día,


    Estoy realizando el siguiente sp:


    USE [BD]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

    CREATE PROCEDURE [dbo].[PRUEBA1]

    --EXEC PRUEBA1 'C'
    --EXEC PRUEBA1 'B'

     @FILTRO NVARCHAR(10)                                        

    AS
    BEGIN

    IF @FILTRO = 'C'
    BEGIN

    DELETE FROM PRUEBA1_TABLA WHERE FILTRO = 'C'
    INSERT INTO PRUEBA1_TABLA

    --INFORMACION
    SELECT DISTINCT
                TABLA1.CAMPO1,
                0 as CAMPO2,

                0 as CAMPO3,

               0 as CAMPO4,

               0 as CAMPO5

           

    FROM TABLA1(NOLOCK)


    END
    ELSE

    IF @FILTRO = 'B'
    BEGIN
    DELETE FROM PRUEBA1_TABLA WHERE FILTRO = 'B'
    INSERT INTO PRUEBA1_TABLA

    --INFORMACION 1
    SELECT TABLA1.CAMPO1,
           0 as CAMPO2,

           0 as CAMPO3,

           0 as CAMPO4,

            0 as CAMPO5     


     FROM TABLA1(NOLOCK)
    WHERE TABLA1.CAMPO3=1

    --INFORMACION 2
    UNION
    SELECT TABLA1.CAMPO1,
           0 as CAMPO2,

           0 as CAMPO3,

           0 as CAMPO4,

           0 as CAMPO5


    FROM TABLA1(NOLOCK)
    WHERE TABLA1.CAMPO3=2

    END

    UPDATE PRUEBA1_TABLA
    SET CAMPO3 = DBO.[FUNCION_C](CAMPO1,'V')
    FROM PRUEBA1_TABLA
    WHERE FILTRO = @FILTRO

    UPDATE PRUEBA1_TABLA
    SET CAMPO4 = DBO.[FUNCION_C](CAMPO1,'A')
    FROM PRUEBA1_TABLA
    WHERE FILTRO = @FILTRO

    UPDATE PRUEBA1_TABLA
    SET CAMPO5 = DBO.[FUNCION_C](CAMPO1,'R')
    FROM PRUEBA1_TABLA
    WHERE FILTRO = @FILTRO

        
    END

    Ejecutandolo asi:

    --EXEC PRUEBA1 'C' se demora 46 minutos para 88416 registros
    --EXEC PRUEBA1 'B' se demora 25 segundos para 65 registros

    La funcion que utilizo es la siguiente:

                                      

    USE [BD]
    GO

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

    CREATE FUNCTION [dbo].[FUNCION_C] (@campo1 INT, @campo_c CHAR(15))
    RETURNS INT
    AS
    BEGIN

        DECLARE @NUM

            BEGIN
            SET @NUM=0
            SELECT @NUM =COUNT(ID)
                FROM [BD1].TABLA_ATEN -- TABLA DE OTRA BD
                WHERE TABLA_ATEN.campo1 = @campo1
                AND TABLA_ATEN.campo_c=@campo_c
            END

    RETURN @NUM

    END
    GO

    miércoles, 25 de abril de 2012 12:25
  • Ahora, necesito actualizar el campo2 de la tabla PRUEBA1_TABLA alimentada en el sp PRUEBA1:

    UPDATE PRUEBA1_TABLA
    SET campo2 =

    (SELECT (tabla_cc.val*12)-(DBO.[funcion_r] (PRUEBA1_TABLA.campo1, 'V')
    + DBO.[funcion_r] (PRUEBA1_TABLA.campo1, 'A')+ DBO.[funcion_r] (PRUEBA1_TABLA.campo1, 'R')))
    FROM tablacc, PRUEBA1_TABLA
    WHERE tablacc.campo1 = PRUEBA1_TABLA.campo1




    miércoles, 25 de abril de 2012 12:32
  • y esta es la última función que utilizo:

    USE [BD]
    GO

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

    ALTER FUNCTION [dbo].[funcion_r] (@campo1 INT, @campo_c CHAR(15))
    RETURNS INT
    AS
    BEGIN
        
        DECLARE @VALOR decimal(28,2)
        

        BEGIN
            SET @VALOR=0
            SELECT @VALOR =

    (select DBO.[funcion_c](@campo1,@campo_c)*tabla_v.VALOR)
                FROM [BD1].tabla_aten, --tabla de otra BD
                tabla_v,
                PRUEBA1_TABLA
                WHERE
                tabla_v.tipo = tabla_aten.tipo
                AND tabla_aten.campo1 = @campo1
                AND tabla_aten.campo2 = @campo_c
                
            END
            
            
     RETURN @VALOR
     
    END

    GO

    Pero dura ejecutando mas de una hora el solo update que escribi en el mensaje anterior y me toca detenerlo ... Agradezco la ayuda, es urgente



    miércoles, 25 de abril de 2012 12:42
  • Hola. Gracias por los mensajes adicionales, pero no es claro que quieres hacer... Reducir el tiempo de ejecución? Detener el UPDATE? Buscar otra manera de escribir el procedimiento almacenado? Y lo otro, para un número de registros, dice que se tarda 46 minutos y ahora dices que lleva una hora y que necesita detenerlo... De nuevo, es confuso.

    Gracias de nuevo y saludos,


    Guillermo Taylor F.
    IT Pro & Xbox gamer
    My blog

    miércoles, 25 de abril de 2012 13:11
  • Lo unico que necesito es hacer el siguiente update:

    UPDATE PRUEBA1_TABLA
    SET campo2 =

    (SELECT (tabla_cc.val*12)-(DBO.[funcion_r] (PRUEBA1_TABLA.campo1, 'V')
    + DBO.[funcion_r] (PRUEBA1_TABLA.campo1, 'A')+ DBO.[funcion_r] (PRUEBA1_TABLA.campo1, 'R')))
    FROM tablacc, PRUEBA1_TABLA
    WHERE tablacc.campo1 = PRUEBA1_TABLA.campo1

    Reduciendo el tiempo de ejecucion, si es necesario buscar otra manera de escribir este update.

    Tarda 46 minutos ejecutando el procedimiento --EXEC PRUEBA1 'C' se demora 46 minutos para 88416 registros (que no tiene que ver con lo que necesito.)

    Lo que dura mas de una hora es el update que acabo de pegar aca, y nunca termina.

    Gracias!

    miércoles, 25 de abril de 2012 13:50
  • El problema (como mínimo) lo tienes en este from

              FROM [BD1].tabla_aten, --tabla de otra BD
                tabla_v,
                PRUEBA1_TABLA
                WHERE 
                tabla_v.tipo = tabla_aten.tipo 
                AND tabla_aten.campo1 = @campo1
                AND tabla_aten.campo2 = @campo_c

    ya que haces join de tabla_v con tabla_aten, y CROSS JOIN con Prueba1_tabl, es decir no la relacionas por lo que eso devolverá los registros que filtren tabla1 y tabla_aten( imaginemos que solo 1) multiplicados por el número de fila de prueba_1 tabla.. tabla que por cierto no usas.

    Por otra parte si esa funcion solamente hace un select... sacalo de una udf y metelo como código normal que saldrás ganando. 


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    miércoles, 25 de abril de 2012 15:07
    Moderador
  • Hola.

    ¿Resolviste el problema?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    sábado, 5 de mayo de 2012 6:14
    Moderador
  • Si, gracias!!! con un top 1.
    • Marcado como respuesta Marce_M miércoles, 9 de mayo de 2012 2:30
    miércoles, 9 de mayo de 2012 2:29