Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Insert or Update (https://www.clubdelphi.com/foros/showthread.php?t=95599)

MAXIUM 07-03-2022 18:49:21

Insert or Update
 
Hola,

La consulta es muy simple. ¿Como puedo hacer un Insert or Update en MSSQL usando Delphi? :rolleyes:

Ideal poder usar parametros...

Muchas gracias como siempre.

Casimiro Noteví 07-03-2022 18:54:15

Algo así:
Código SQL [-]
begin tran    
  update table with (serializable) set ...    where key = @key     
  if @@rowcount = 0    
  begin      
    insert into table (key, ...) values (@key,..)    
  end 
commit tran

También puedes hacer un insert en un try except y si falla entonces hacer el update

Código Delphi [-]
try
  insert ...
except
  update ...
end

mamcx 07-03-2022 19:05:37

La manera mas correcta usando SQL moderno es usando MERGE:

https://docs.microsoft.com/es-mx/sql...l-server-ver15
Código SQL [-]
ALTER PROCEDURE dbo.InsertUnitMeasure  
    @UnitMeasureCode nchar(3),  
    @Name nvarchar(25)  
AS
BEGIN  
    SET NOCOUNT ON;  
  
    MERGE Production.UnitMeasure AS tgt  
    USING (SELECT @UnitMeasureCode, @Name) as src (UnitMeasureCode, Name)  
    ON (tgt.UnitMeasureCode = src.UnitMeasureCode)  
    WHEN MATCHED THEN
        UPDATE SET Name = src.Name  
    WHEN NOT MATCHED THEN  
        INSERT (UnitMeasureCode, Name)  
        VALUES (src.UnitMeasureCode, src.Name)  
    OUTPUT deleted.*, $action, inserted.* INTO #MyTempTable;  
END;

Es muy importante entender que este método es mas confiable y veloz que la forma antigua, que solo se usa si la version del motor es VIEJA.

Este articulo explica bien los problemas de hacer un "upset/merge" ad-hoc:

https://michaeljswart.com/2017/07/sq...-antipatterns/

Neftali [Germán.Estévez] 07-03-2022 19:14:09

No comentas qué componentes estás utilizando (ODO, FireDAC,...)
El MERGE es potente, pero la verdad es que no es fácil ni trivial utilizarlo.
Para consultas sencillas (con ADO) yo suelo utilizar el ROWCOUNT que ha comentado [Casimiro].

El algun caso el MERGE, pero hay que tenerlo muy claro... :o

MAXIUM 07-03-2022 21:28:07

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 545844)
No comentas qué componentes estás utilizando (ODO, FireDAC,...)
El MERGE es potente, pero la verdad es que no es fácil ni trivial utilizarlo.
Para consultas sencillas (con ADO) yo suelo utilizar el ROWCOUNT que ha comentado [Casimiro].

El algun caso el MERGE, pero hay que tenerlo muy claro... :o

Toda la razón. No consideré aquello. Uso los componentes de ADO


La franja horaria es GMT +2. Ahora son las 20:43:31.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi