Ich versuche, eine MS SQL server Upsert Abfrage mit MERGE zu schreiben

Es funktioniert für die Aktualisierung einer vorhandenen Zeile, aber es fügt nicht die Zeile ein, wenn es keinen Eintrag gibt.

Dies ist die CREATE TABLE:

CREATE TABLE [dbo].[Inventory_Update_Hash_Code] ([Product_Id] [int] NOT NULL, [Feed_Id] [int] NOT NULL, [Hash_Code] [int] NOT NULL, [Last_Updated] [datetime2](0) NOT NULL GO ALTER TABLE [dbo].[Inventory_Update_Hash_Code] ADD PRIMARY KEY ([Product_Id], [Feed_Id]) GO 

Und das ist die Abfrage:

  MERGE Product_Update_Hash_Code WITH (HOLDLOCK) AS tar USING (SELECT Feed_Id, Product_Id FROM Product_Update_Hash_Code WHERE Feed_Id = 261 AND Product_Id = 300) AS source ON (tar.Feed_Id = source.Feed_Id AND tar.Product_Id = source.Product_Id) WHEN MATCHED THEN UPDATE SET tar.Hash_Code = 55, tar.Last_Updated = SYSUTCDATETIME() WHEN NOT MATCHED THEN INSERT (Feed_Id, Product_Id, Last_Updated, Hash_Code) VALUES (261, 300, SYSUTCDATETIME(), 55); 

Es sieht so aus, als ob die "UNMATCHED" -Klausel nicht ausgeführt wird. Habe ich das falsch gemacht?

Du solltest nicht die Tabelle benutzen, selbst als deine Quelle – wie kannst du erwarten, dass es fehlende Zeilen findet, wenn du Zeilen in dieser Tabelle als deine Quelle verwende.

Stattdessen sollten Sie Ihre Eingabedaten unabhängig von einer tatsächlichen datatabelle oder mit einer VALUES Klausel VALUES :

 MERGE [Inventory_Update_Hash_Code] WITH (HOLDLOCK) AS tar USING (VALUES (261,300,55,SYSUTCDATETIME())) AS source (Feed_Id,Product_ID,Hash_Code,Last_Updated) ON (tar.Feed_Id = source.Feed_Id AND tar.Product_Id = source.Product_Id) WHEN MATCHED THEN UPDATE SET tar.Hash_Code = source.Hash_Code, tar.Last_Updated = source.Last_Updated WHEN NOT MATCHED THEN INSERT (Feed_Id, Product_Id, Hash_Code, Last_Updated) VALUES (Feed_Id,Product_ID,Hash_Code,Last_Updated); 

(Beachten Sie, dass es in der Frage zwischen dem CREATE TABLE und dem MERGE einen Tabellennamen-Mismatch gab. Ich habe den Namen CREATE TABLE umgestellt, damit ich die für den Code ausgeführten Änderungen minimieren könnte.

–MayBe Hilft das

 MERGE Product_Update_Hash_Code WITH (HOLDLOCK) AS tar USING ( SELECT Feed_Id ,Product_Id FROM Product_Update_Hash_Code WHERE Feed_Id = 261 AND Product_Id = 300 ) AS source ON ( tar.Feed_Id = source.Feed_Id AND tar.Product_Id = source.Product_Id ) WHEN MATCHED THEN UPDATE SET tar.Hash_Code = 55 ,tar.Last_Updated = SYSUTCDATETIME() WHEN NOT MATCHED BY TARGET THEN INSERT ( Feed_Id ,Product_Id ,Last_Updated ,Hash_Code ) VALUES ( 261 ,300 ,SYSUTCDATETIME() ,55 );