2017-03-16 51 views
0

它用於更新現有行,但不會在沒有條目時插入行。我正在嘗試使用MERGE編寫MS SQL Server Upsert查詢

這是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 

這是查詢:

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); 

它看起來像 「不匹配」 的條款沒有得到執行。我弄錯了嗎?

+0

你在使用MySQL,MS SQL Server嗎?或者MSQL ...?不要標記不涉及的產品。 – jarlh

+0

我很抱歉。我錯誤地添加了MySQL。它是Microsoft SQL 2008. –

+0

目標表也是源代碼很少是正確的 - 當您將表本身用作行源時,您期望獲得無與倫比的結果嗎? –

回答

1

你不應該使用表,本身作爲源 - 你怎麼能指望它找到,如果你在一個表中使用的行,列缺你資源。

相反,你應該獨立採購輸入數據,無論是從實際的數據表或通過使用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); 

(請注意,是在CREATE TABLE之間你的問題的表名不匹配和MERGE我已經切換到CREATE TABLE這個名字,這樣我就可以儘量減少運行你的代碼所需的修改)

+0

謝謝!這似乎是正確的做法。感謝你向我解釋我做錯了什麼。 –

1

--MayBe幫助這個

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 
      ); 
+0

感謝您的回覆!不幸的是,這也沒有奏效。 –