Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Instrukcja SQL MERGE do aktualizacji danych

Zakładając, że potrzebujesz rzeczywistego SQL Server MERGE oświadczenie:

MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
USING dbo.temp_energydata AS source
    ON target.webmeterID = source.webmeterID
    AND target.DateTime = source.DateTime
WHEN MATCHED THEN 
    UPDATE SET target.kWh = source.kWh
WHEN NOT MATCHED BY TARGET THEN
    INSERT (webmeterID, DateTime, kWh)
    VALUES (source.webmeterID, source.DateTime, source.kWh);

Jeśli chcesz również usunąć rekordy w miejscu docelowym, których nie ma w źródle:

MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
USING dbo.temp_energydata AS source
    ON target.webmeterID = source.webmeterID
    AND target.DateTime = source.DateTime
WHEN MATCHED THEN 
    UPDATE SET target.kWh = source.kWh
WHEN NOT MATCHED BY TARGET THEN
    INSERT (webmeterID, DateTime, kWh)
    VALUES (source.webmeterID, source.DateTime, source.kWh)
WHEN NOT MATCHED BY SOURCE THEN
    DELETE;

Ponieważ stało się to nieco bardziej popularne, uważam, że powinienem nieco rozszerzyć tę odpowiedź o pewne zastrzeżenia, o których należy pamiętać.

Po pierwsze, istnieje kilka blogów, które zgłaszają problemy ze współbieżnością z MERGE oświadczenie w starszych wersjach SQL Server. Nie wiem, czy ten problem został kiedykolwiek poruszony w późniejszych wydaniach. Tak czy inaczej, można to w dużej mierze obejść, określając HOLDLOCK lub SERIALIZABLE wskazówka blokady:

MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
[...]

Możesz również osiągnąć to samo z bardziej restrykcyjnymi poziomami izolacji transakcji.

Istnieje kilka innych znanych problemów z MERGE . (Zauważ, że odkąd Microsoft wyrzucił Connect i nie połączył problemów w starym systemie z problemami w nowym systemie, te starsze problemy są trudne do wyśledzenia. Dzięki, Microsoft!) Z tego, co mogę powiedzieć, większość z nich nie jest powszechna problemy lub można je obejść za pomocą tych samych wskazówek dotyczących blokowania, jak powyżej, ale ich nie testowałem.

Tak jak jest, mimo że nigdy nie miałem żadnych problemów z MERGE oświadczenie, zawsze używam WITH (HOLDLOCK) podpowiedź teraz i wolę używać tego stwierdzenia tylko w najprostszych przypadkach.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sprawdzanie kopii zapasowej serwera SQL

  2. Przekaż identyfikator najemcy przez połączenie z serwerem sql

  3. Odczytywanie i zwiększanie wartości int w SQL Server

  4. Zwróć listę wiadomości e-mail wysłanych z poczty bazy danych SQL Server (T-SQL)

  5. Jak zdekodować ciąg znaków Unicode base64 za pomocą T-SQL