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.