none
INSERT CONDICIONAL EN TABLA RRS feed

  • Pregunta

  • saludos, como puedo realizar un insert condicional en sql

    tengo un procedure que comienza algo asi

    CREATE PROCEDURE [dbo].[USP_ACTUALIZA_EXCEL]  
    @ExcelTVP TVP_Tabla READONLY  
    AS  
    BEGIN  
     INSERT INTO [dbo].[TB_TABLA]
    SELECT * FROM @ExcelTVP   

    el TVP_Tabla tiene un campo id, lo que quiero es actualizar la tabla cuando hayan registros coincidentes e insertar filas cuando no.

    saludos.


    viernes, 25 de noviembre de 2016 14:11

Respuestas

  • Lo resolví con algo como esto

    .... BEGIN IF EXISTS (SELECT A2.ID FROM [dbo].[TB_TABLA] A2 INNER JOIN @ExcelTVP B ON A2.ID=B.ID) BEGIN UPDATE TB_AIRE_ACONDICIONADO .....

    END

    IF (SELECT COUNT(1) FROM @ExcelTVP TVP  
       LEFT JOIN [dbo].[TB_TABLA] AC ON TVP.ID=AC.ID)>0  
    BEGIN  
    INSERT INTO TB_AIRE_ACONDICIONADO(    

    ......

    END


    martes, 6 de diciembre de 2016 20:44

Todas las respuestas

  • Tenese que usar el Merge

    https://msdn.microsoft.com/en-us/library/bb510625.aspx


    Carlos Ignacio Aguero. DBA SQL Server. Toda mi respeto al pueblo Peruano por la ayuda prestada en la guerra de Malvinas.

    viernes, 25 de noviembre de 2016 14:15
  • Tenese que usar el Merge

    https://msdn.microsoft.com/en-us/library/bb510625.aspx


    Carlos Ignacio Aguero. DBA SQL Server. Toda mi respeto al pueblo Peruano por la ayuda prestada en la guerra de Malvinas.

    Hola si estaba pensando en algo como eso, 

    IF NOT EXISTS (SELECT col FROM tbl_A A2 WHERE A2.col = tbl_B.col);  
    
    INSERT tbl_A (col, col2)  
    SELECT col, col2   
    FROM tbl_B   
    
    ELSE 
    
    UPDATE...

    viernes, 25 de noviembre de 2016 14:31
  • por que no usas el merge, podes hacer cosas del sigueinte estilo
        MERGE Production.UnitMeasure AS target  
        USING (SELECT @UnitMeasureCode, @Name) AS source (UnitMeasureCode, Name)  
        ON (target.UnitMeasureCode = source.UnitMeasureCode)  
        WHEN MATCHED THEN   
            UPDATE SET Name = source.Name  
    WHEN NOT MATCHED THEN  
        INSERT (UnitMeasureCode, Name)  
        VALUES (source.UnitMeasureCode, source.Name)  
        OUTPUT deleted.*, $action, inserted.* INTO #MyTempTable;  


    Carlos Ignacio Aguero. DBA SQL Server. Toda mi respeto al pueblo Peruano por la ayuda prestada en la guerra de Malvinas.

    viernes, 25 de noviembre de 2016 14:35
  • hola Carlos Ignacio, gracias por la sugerencia, prefiero hacerlo de forma que me quede mas claro y simple
    viernes, 25 de noviembre de 2016 14:46
  • Eduardo_developer,

    La instrucción MERGE es una buena opción incluso por rendimiento (siempre y cuando la versión del motor de SQL Server te lo permita), sin embargo si requieres la "manera tradicional" puedes hacer lo siguiente:

    CREATE PROCEDURE dbo.USP_ACTUALIZA_EXCEL
        @ExcelTVP TVP_Tabla READONLY
    AS  
    BEGIN  
        UPDATE t2
        SET
    	   t2.Col1 = t1.Col1,
    	   t2.Col2 = t1.Col2,
    	   /*...*/
        FROM
    	   @ExcelTVP t1
    	   INNER JOIN dbo.TB_TABLA t2 ON (t1.id = t2.id);
    
        INSERT INTO dbo.TB_TABLA
        SELECT * FROM @ExcelTVP t1
        WHERE NOT EXISTS (SELECT 1 FROM dbo.TB_TABLA t2 WHERE t1.id = t2.id);    
    END


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 25 de noviembre de 2016 15:02
  • En general merge es un performance killer en la mayoria de los casos aunque es de lo mas facil de implementar, como todo ve si se ajusta a tu escenario (yo hago uso de esta luego).
    viernes, 25 de noviembre de 2016 16:46
  • En que te basas para afirmar "merge es un performance killer" , es la primera vez que leo al respecto, pero me gustaria que lo ejemplificaras o dieras alguna referencia.



    "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

    viernes, 25 de noviembre de 2016 19:36
  • Claro

    http://www.sqlservercentral.com/Forums/Topic1465931-391-1.aspx

    http://www.sqlservercentral.com/Forums/Topic1708102-3412-1.aspx

    Aqui con ejemplos

    http://www.sqlservercentral.com/articles/MERGE/103127/

    https://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/

    Dije en general, como uso comun no siempre ya que aunque se puede preparar no es tan flexible, no dije siempre es peor pero en general tiene menos flexibilidad.

    viernes, 25 de noviembre de 2016 19:41
  • Voy a revisar, en especial el articulo de Bertrand, tu afirmacion de Killer al inicio me dejo fuera de juego, aunque he experimentado situaciones como condiciones de carrera, pero tampoco creo que es tan nocivo, de hecho creeria que en el 95% de los casos es suficientemente funcional.

    "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

    viernes, 25 de noviembre de 2016 19:59
  • Eduardo_developer,

    La instrucción MERGE es una buena opción incluso por rendimiento (siempre y cuando la versión del motor de SQL Server te lo permita), sin embargo si requieres la "manera tradicional" puedes hacer lo siguiente:

    CREATE PROCEDURE dbo.USP_ACTUALIZA_EXCEL
        @ExcelTVP TVP_Tabla READONLY
    AS  
    BEGIN  
        UPDATE t2
        SET
    	   t2.Col1 = t1.Col1,
    	   t2.Col2 = t1.Col2,
    	   /*...*/
        FROM
    	   @ExcelTVP t1
    	   INNER JOIN dbo.TB_TABLA t2 ON (t1.id = t2.id);
    
        INSERT INTO dbo.TB_TABLA
        SELECT * FROM @ExcelTVP t1
        WHERE NOT EXISTS (SELECT 1 FROM dbo.TB_TABLA t2 WHERE t1.id = t2.id);    
    END


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    Hola , he probado esto y realmnete no funciona como yo deseo, porque hace el update pero tambien en todos los casos hace un insert y el insert debería ser condicional a que no exista elr egistro por el id
    viernes, 2 de diciembre de 2016 15:37
  • Eduardo no seas cerrado a nuevos conocimientos, usa el merge te va dar buenos resultados

    Carlos Ignacio Aguero. DBA SQL Server. Toda mi respeto al pueblo Peruano por la ayuda prestada en la guerra de Malvinas.

    viernes, 2 de diciembre de 2016 15:48
  • Lo resolví con algo como esto

    .... BEGIN IF EXISTS (SELECT A2.ID FROM [dbo].[TB_TABLA] A2 INNER JOIN @ExcelTVP B ON A2.ID=B.ID) BEGIN UPDATE TB_AIRE_ACONDICIONADO .....

    END

    IF (SELECT COUNT(1) FROM @ExcelTVP TVP  
       LEFT JOIN [dbo].[TB_TABLA] AC ON TVP.ID=AC.ID)>0  
    BEGIN  
    INSERT INTO TB_AIRE_ACONDICIONADO(    

    ......

    END


    martes, 6 de diciembre de 2016 20:44