none
Como hacer un inserción/actualización entre tablas en distintas bases de datos RRS feed

  • Pregunta

  • Hola;

    Necesito insertar los registros de una tabla ubicada en una base de datos hasta esa misma tabla ubicada en otra base de datos. Ambas bases de datos están en la misma instancia.

    También necesito actualizar determinados campos de ese registro en la tabla destino si ese registro ya existiera. Para hacer este mismo proceso entre tablas ubicadas en la misma base de datos he utilizado hasta ahora mismo:

    MERGE Data AS Destino
    
    USING (SELECT [IdActivo],[Fecha],[Hora],Periodo,[Open1],[High],[Low],[Close1]
    FROM RECEPCIONDATA) AS Origen
    
    ON (Destino.IdActivo = Origen.IdActivo 
    AND Destino.Fecha = Origen.Fecha 
    AND Destino.Hora = Origen.Hora 
    AND Destino.Periodo = Origen.Periodo 
    
    )
    
    WHEN NOT MATCHED THEN INSERT ([IdActivo],[Periodo],[Fecha],[Hora],[Open1],[High],[Low],[Close1])
    VALUES (
    	Origen.IdActivo
          ,Origen.Periodo
          ,Origen.Fecha
          ,Origen.Hora
          ,Origen.Open1
          ,Origen.High
          ,Origen.Low
          ,Origen.Close1
       
    )
    WHEN MATCHED THEN
    	UPDATE SET Open1 = Origen.Open1, High = Origen.High, Low = Origen.Low, Close1 = Origen.Close1
    	;
    
    GO

    Decir que la tabla DATA se encuentra en la BD Central y la tabla RECEPCIONDATA se encuentra en la base de datos Recepción.

    Basicamente el problema que observo es que no reconoce la tabla Data al ponerla como destino en el MERGE. Es decir, uso Central.dbo.Data y no me la reconoce.

    ¿alguna idea de qué puede estar ocurriendo?

    Gracias

    Angel

    viernes, 20 de enero de 2017 11:40

Respuestas

  • Angeleci,

    Debes nombrar a cada tabla anteponiendo la base de datos a la que pertenece:

    MERGE Central.dbo.Data AS Destino
    USING (SELECT IdActivo, Fecha, Hora, Periodo, Open1, High, Low, Close1
    	   FROM Recepcion.dbo.RECEPCIONDATA) AS Origen
    ON (Destino.IdActivo = Origen.IdActivo 
        AND Destino.Fecha = Origen.Fecha 
        AND Destino.Hora = Origen.Hora 
        AND Destino.Periodo = Origen.Periodo)
    WHEN NOT MATCHED THEN 
        INSERT (IdActivo, Periodo, Fecha, Hora, Open1, High, Low, Close1)
        VALUES (Origen.IdActivo, Origen.Periodo, Origen.Fecha, Origen.Hora,
    		  Origen.Open1, Origen.High, Origen.Low, Origen.Close1)
    WHEN MATCHED THEN
    	UPDATE SET 
    	   Destino.Open1 = Origen.Open1, 
    	   Destino.High = Origen.High, 
    	   Destino.Low = Origen.Low, 
    	   Destino.Close1 = Origen.Close1;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Angeleci lunes, 23 de enero de 2017 14:28
    viernes, 20 de enero de 2017 17:22
  • Angeleci,

    Recién acabo de leer el último párrafo donde indicas que nombras la tabla con la nomenclatura <BaseDatos.Esquema.Tabla>, ¿qué error obtienes?. ¿Estás seguro que la tabla [Data] pertenece al esquema 'dbo'?, puedes corroborarlo con el siguiente script:

    SELECT * FROM Information_schema.Columns
    WHERE table_name = 'Data';


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Angeleci lunes, 23 de enero de 2017 14:28
    • Desmarcado como respuesta Angeleci lunes, 23 de enero de 2017 14:28
    • Marcado como respuesta Joyce_ACModerator miércoles, 25 de enero de 2017 23:53
    viernes, 20 de enero de 2017 17:34

Todas las respuestas

  • Angeleci,

    Debes nombrar a cada tabla anteponiendo la base de datos a la que pertenece:

    MERGE Central.dbo.Data AS Destino
    USING (SELECT IdActivo, Fecha, Hora, Periodo, Open1, High, Low, Close1
    	   FROM Recepcion.dbo.RECEPCIONDATA) AS Origen
    ON (Destino.IdActivo = Origen.IdActivo 
        AND Destino.Fecha = Origen.Fecha 
        AND Destino.Hora = Origen.Hora 
        AND Destino.Periodo = Origen.Periodo)
    WHEN NOT MATCHED THEN 
        INSERT (IdActivo, Periodo, Fecha, Hora, Open1, High, Low, Close1)
        VALUES (Origen.IdActivo, Origen.Periodo, Origen.Fecha, Origen.Hora,
    		  Origen.Open1, Origen.High, Origen.Low, Origen.Close1)
    WHEN MATCHED THEN
    	UPDATE SET 
    	   Destino.Open1 = Origen.Open1, 
    	   Destino.High = Origen.High, 
    	   Destino.Low = Origen.Low, 
    	   Destino.Close1 = Origen.Close1;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Angeleci lunes, 23 de enero de 2017 14:28
    viernes, 20 de enero de 2017 17:22
  • Angeleci,

    Recién acabo de leer el último párrafo donde indicas que nombras la tabla con la nomenclatura <BaseDatos.Esquema.Tabla>, ¿qué error obtienes?. ¿Estás seguro que la tabla [Data] pertenece al esquema 'dbo'?, puedes corroborarlo con el siguiente script:

    SELECT * FROM Information_schema.Columns
    WHERE table_name = 'Data';


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Angeleci lunes, 23 de enero de 2017 14:28
    • Desmarcado como respuesta Angeleci lunes, 23 de enero de 2017 14:28
    • Marcado como respuesta Joyce_ACModerator miércoles, 25 de enero de 2017 23:53
    viernes, 20 de enero de 2017 17:34
  • Hola Willams.

    Gracias por tu respuesta.

    Ha funcionado. La verdad es que no sé porque no funcionaba antes cuando he hecho lo mismo.

    Un saludo

    lunes, 23 de enero de 2017 14:30