2016-08-31 148 views
0

在UI中,我將一個數據表傳遞給存儲過程。的類型參數的是具有下列結構使用MERGE刪除數據或插入

Personkey int 
ComponentKey varchar 

該數據需要進入一個表,和數據存在於表中,但不是在數據表中應刪除用戶定義的表中的字段。

實施例表數據

PersonKey  ComponentKey 
123   A1 
456   B9 

而我的表具有2行,一個匹配行和一個新行

實施例的數據表數據

PersonKey ComponentKey 
123   A1 
786   Z6 

的結果是456/B9行應該被刪除,123/A1行將不會發生任何變化,並且應該插入786/Z6行。

我相信我可以使用MERGE語句,但我不知道如何形成它。

我明白,當不匹配我應該做插入,但刪除部分進入它呢?

MERGE Components 
USING @passedInData 
ON PersonKey = DatatblPersonKey AND ComponentKey = DatatblComponentKey 

WHEN MATCHED THEN 
-- DO nothing... 

WHEN NOT MATCHED 
INSERT (PersonKey, ComponentKey) VALUES (DatatblPersonKey, DatatblComponentey); 

編輯:要清楚,數據表可以包含許多行,對於同一個人密鑰,但組件密鑰會不同。

實施例的數據表數據

PersonKey ComponentKey 
123   Z6 
123   C5 

實施例表數據

PersonKey  ComponentKey 
123   A1 
456   B9 

插入上述數據表後的結果應該是

PersonKey ComponentKey 
123   Z6 
123   C5 
456   B9 

注意,123/A1已經被刪除和456/B9仍在桌面上。

回答

0

默認的「WHEN NOT MATCHED」假定您真正的意思是「什麼時候不按目標匹配」。您可以使用簡單的命令「DELETE」做另一個聲明「未通過源匹配」。

這樣做時要小心,因爲它會根據您指定的比較從目標中刪除與源不匹配的所有記錄。如果需要爲該操作執行一個目標子集,則可以將該cte與該過濾器一起使用,然後針對該目標執行合併。

編輯...演示瞭如何掛鉤我說的話:

DECLARE @databaseTable TABLE (PersonKey INT, ComponentKey VARCHAR(10)); 
INSERT INTO @databaseTable 
VALUES 
    (123, 'A1'), 
    (456, 'B9'); 
DECLARE @appDataset TABLE (PersonKey INT, ComponentKey VARCHAR(10)); 
INSERT INTO @appDataset 
VALUES 
    (123, 'Z6'), 
    (123, 'C5'); 

WITH cteTarget AS 
    (
    SELECT dt.PersonKey 
     , dt.ComponentKey 
    FROM @databaseTable AS dt 
    JOIN (SELECT DISTINCT PersonKey FROM @appDataset) AS pk 
     ON pk.PersonKey = dt.PersonKey 
    ) 
MERGE cteTarget AS tgt 
USING @appDataset AS src 
    ON src.PersonKey = tgt.PersonKey 
    AND src.ComponentKey = tgt.ComponentKey 
WHEN NOT MATCHED BY SOURCE THEN 
    DELETE 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT 
     (PersonKey 
     ,ComponentKey) 
    VALUES 
     (src.PersonKey 
     ,src.ComponentKey); 

SELECT * FROM @databaseTable; 
+0

我更新了我的問題,因爲這種方法沒有奏效。 – andrewb

+1

您的執行可能沒有奏效,但方法確實如此。我編輯了我的答案,以包含數據的結構和針對您的問題的編碼解決方案。再次強調,你必須注意確定你的目標是什麼。 – btberry

相關問題