none
Insertar Datos a una Tabla mediante una Vista. RRS feed

  • Pregunta

  • Buen día, Tengo mi base de datos y una tabla en esta llamada centro_costo, la cual por el momento esta vacía pero necesito llenarla mediante los datos que extraigo de una Vista llamada vw_centrodecostorrhh y que estos datos se ingresen en mi base de datos en mi tabla centro_costo.

    Pero a la vez, que siempre actualice los datos una vez por semana quizá y que solo ingrese los datos nuevos en todo caso.

    Agradezco su repuesta.

    martes, 13 de marzo de 2018 18:07

Respuestas

  • Merge Centro_Costo As Tgt
    Using dbo.VW_Centrodecostorrhh As Src
    On Tgt.ID_CC = Src.Cod_SAP_CC
    When Matched Then
    Update
    Set
        Tgt.ID_Gerencia = Src.Cod_SAP_Gerencia
        , Tgt.DESC_CC = Src.Nombre_CC
    When Not Matched By Source Then
    --Aquí puede borrar lo que ya no está en la vista
    Delete
    When Not Matched By Target Then
    Insert (ID_CC, ID_GERENCIA, DESC_CC)
    Values(Src.Cod_SAP_CC, Src.Cod_SAP_Gerencia, Src.Nombre_CC)
    ;


    Jose R. MCP
    Code Samples


    martes, 13 de marzo de 2018 21:22

Todas las respuestas

  • Aprenda y utilice la sentencia de T-SQL MERGE.  Sin saber detalles de columnas y cómo se relaciona la tabla con la vista, me es imposible decirle más.

    Jose R. MCP
    Code Samples

    martes, 13 de marzo de 2018 18:36
  • Es que la vista contiene:

    SELECT [Cod_SAP_CC]
        ,[Nombre_CC]
        ,[Cod_SAP_Gerencia]   
    FROM [dbo].[VW_Centrodecostorrhh]

    Necesito Ingresarla a la tabla Centro_Costo que posee estos campos: 

    [ID_CC]
    ,[ID_GERENCIA]
    ,[DESC_CC]

    De forma automática no se si me explico?

      
    martes, 13 de marzo de 2018 20:09
  • INSERT INTO Centro_Costo (ID_CC, ID_GERENCIA, DESC_CC)
    SELECT * FROM [dbo].[VW_Centrodecostorrhh]
    WHERE not exists ...

    Tienen que coincidir los tipos o que funcione la conversión implícita. Si no es así tendrás que tratar los datos del select.

    Investiga sobre el uso de la sentencia not exists, es muy util.

    Por otro lado para automatizarlo puedes ejecutar la sentencia en un job de bbdd, simplemente crea un paso y en ese paso ponle la sentencia una vez la tengas testeada.

    martes, 13 de marzo de 2018 20:21
  • Muchas gracias, consulta tendría que hacerlo en un procedimiento almacenado?
    martes, 13 de marzo de 2018 20:26
  • Un simple INSERT no lo logra.  También tiene que actualizar registros existentes, imagino yo.

    Necesita un MERGE.  Para que MERGE funcione, necesita identificar las claves primarias de los registros para evitar duplicaciones.

    Puede encapsular la sincronización en un procedimiento almacenado.  Es deseable, de hecho, porque luego tiene que agendar un job de SQL Server para que corra el procedimiento almacenado automáticamente de forma periódica.

    Si me dice cuál es la clave primaria, le puedo poner un ejemplo.  Asumo que COD_SAP_CC va con ID_CC, Cod_SAP_Gerencia con ID_GERENCIA y Nombre_CC con DESC_CC.


    Jose R. MCP
    Code Samples

    martes, 13 de marzo de 2018 20:52
  • Si asi es, en este caso el ID_CC es la llave primaria y es UNIQUE Muchas gracias
    martes, 13 de marzo de 2018 21:10
  • Merge Centro_Costo As Tgt
    Using dbo.VW_Centrodecostorrhh As Src
    On Tgt.ID_CC = Src.Cod_SAP_CC
    When Matched Then
    Update
    Set
        Tgt.ID_Gerencia = Src.Cod_SAP_Gerencia
        , Tgt.DESC_CC = Src.Nombre_CC
    When Not Matched By Source Then
    --Aquí puede borrar lo que ya no está en la vista
    Delete
    When Not Matched By Target Then
    Insert (ID_CC, ID_GERENCIA, DESC_CC)
    Values(Src.Cod_SAP_CC, Src.Cod_SAP_Gerencia, Src.Nombre_CC)
    ;


    Jose R. MCP
    Code Samples


    martes, 13 de marzo de 2018 21:22
  • Muchas gracias Jose.
    martes, 13 de marzo de 2018 21:52
  • Yo lo realizo de esta manera y no he tenido ningun tipo de problemas

    INSERT INTO Centro_Costo (ID_CC, ID_GERENCIA, DESC_CCSELECT Cod_SAP_CC,Nombre_CC,Cod_SAP_Gerencia 

    FROM VW_Centrodecostorrhh

    Eso es todo.


    jcav

    martes, 13 de marzo de 2018 22:05
  • ¿Y los UPDATE?
    martes, 13 de marzo de 2018 22:22
  • Yo lo realizo de esta manera y no he tenido ningun tipo de problemas

    INSERT INTO Centro_Costo (ID_CC, ID_GERENCIA, DESC_CCSELECT Cod_SAP_CC,Nombre_CC,Cod_SAP_Gerencia 

    FROM VW_Centrodecostorrhh

    Eso es todo.


    jcav

    Eso solamente se encarga de agregar lo nuevo.  Pero, ¿cómo actuliza los cambios de los que ya existían?  ¿Cómo elimina lo que ya no existe?  La respuesta es:  Un INSERT no es suficiente.  Por eso MERGE.

    Jose R. MCP
    Code Samples

    martes, 13 de marzo de 2018 23:01
  • begin transaction
    Merge [dbo].[CENTROS_COSTO] As Tgt
    Using [dbo].[VW_Centrodecostorrhh] As Src
    On Tgt.[ID_CC] = Src.Cod_SAP_CC
    When Matched
    UPDATE
    Set
        Tgt.ID_Gerencia = Src.Cod_SAP_Gerencia,
    Tgt.DESC_CC = Src.Nombre_CC
    When Not Matched By Source
    --Aquí puede borrar lo que ya no está en la vista
    Delete
    When Not Matched By Target
    Insert (ID_CC, ID_GERENCIA, DESC_CC)
    Values(Src.Cod_SAP_CC, Src.Cod_SAP_Gerencia, Src.Nombre_CC);

    Esta bien de esta manera? ya que me tira un error de sintaxis:

    Msg 156, Level 15, State 1, Line 33

    Incorrect syntax near the keyword 'UPDATE'.

    Gracias de antemano.

    miércoles, 14 de marzo de 2018 14:37
  • Ya lo corregí.  Me faltaron 3 palabras "Then".  Programo mucho en C# entonces esa palabra como que escapa mi cerebro.

    Jose R. MCP
    Code Samples

    miércoles, 14 de marzo de 2018 17:21
  • Msg 468, Level 16, State 9, Line 15
    Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Modern_Spanish_CI_AS" in the equal to operation.

    Me tira este error:(

    miércoles, 14 de marzo de 2018 17:56
  • Tienes que usar la instrucción collate.

    Esto te ocurre por incongruencias del idioma de la tabla origen y destino al comparar dos cadenas, la sintaxis de collate es muy fácil, investiga por ahí.

    Saludos.

    jueves, 15 de marzo de 2018 16:05