Home > Scripts > Insert Or update (aka Replace or Upsert)

Insert Or update (aka Replace or Upsert)

Una delle necessità tipica degli sviluppatori è quella di inserire una riga oppure aggiornarne i valori se la riga è già presente. MySQL supporta il comando REPLACE:

http://dev.mysql.com/doc/refman/5.0/en/replace.html

oppure l’opzione INSERT . ON DUPLICATE KEY UPDATE:

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

Con SQL Server si può ottenre lo stesso funzionamento, in modo più standard, usando il comando MERGE ed i Row Constructors.

Partendo da questo esempio:

CREATE TABLE dbo.MyTargetTable 
( 
    id INT NOT NULL PRIMARY KEY IDENTITY, 
    alternate_key VARCHAR(50) UNIQUE, 
    col_1 INT, 
    col_2 INT, 
    col_3 INT, 
    col_4 INT, 
    col_5 INT 
) 
GO

INSERT [dbo].[MyTargetTable] VALUES 
('GUQNH', 10, 100, 1000, 10000, 100000), 
('UJAHL', 20, 200, 2000, 20000, 200000), 
('YKXVW', 30, 300, 3000, 30000, 300000), 
('SXMOJ', 40, 400, 4000, 40000, 400000), 
('JTPGM', 50, 500, 5000, 50000, 500000), 
('ZITKS', 60, 600, 6000, 60000, 600000), 
('GGEYD', 70, 700, 7000, 70000, 700000), 
('UFXMS', 80, 800, 8000, 80000, 800000), 
('BNGGP', 90, 900, 9000, 90000, 900000), 
('AMUKO', 100, 1000, 10000, 100000, 1000000) 
GO

Per inserire o aggiornare una riga basta eseguire questo statement:

MERGE INTO 
    dbo.MyTargetTable T 
USING 
    (SELECT * FROM (VALUES (''ZITKS'', 61, 601, 6001, 60001, 600001)) Dummy(alternate_key, col_1, col_2, col_3, col_4, col_5)) S 
ON 
    T.alternate_key = S.alternate_key 
WHEN 
    NOT MATCHED THEN 
    INSERT VALUES (alternate_key, col_1, col_2, col_3, col_4, col_5) 
WHEN 
    MATCHED AND T.col_1 != S.col_1 THEN 
    UPDATE SET 
        T.col_1 = S.col_1, 
        T.col_2 = S.col_2, 
        T.col_3 = S.col_3, 
        T.col_4 = S.col_4, 
        T.col_5 = S.col_5 
;

Se è necessario inserire/aggiornare più di una riga si può passare all’uso dei Table-Valued Parameters che possono anche essere gestiti direttamente da .NET.

Chi è Davide Mauri

Microsoft Data Platform MVP dal 2007, Davide Mauri si occupa di Data Architecture e Big Data nel mondo dell'IoT. Attualmente ricopre il ruolo di "Director Software Development & Cloud Infrastructure" in Sensoria, societa specializzata nella creazione di Wearables e sensori per l'IoT applicati a tessuti ed oggetti sportivi.

Leggi Anche

sp_alter_column – La stored procedure per modificare una colonna!

La stored procedure sp_alter_column permette di modificare agevolmente il tipo di dato ed il nome di una colonna!