- 官網(wǎng)地址:使用 MERGE 插入、更新和刪除數(shù)據(jù)
- 使用 MERGE 語句執(zhí)行以下操作:
- 有條件地在目標(biāo)表中插入或更新行尸红。
- 如果目標(biāo)表中存在相應(yīng)行谁榜,則更新一個或多個列;否則狼犯,會將數(shù)據(jù)插入新行余寥,同步兩個表。
- 根據(jù)與源數(shù)據(jù)的差別在目標(biāo)表中插入悯森、更新或刪除行宋舷。
MERGE 語法包括五個主要子句:
- MERGE 子句用于指定作為插入、更新或刪除操作目標(biāo)的表或視圖瓢姻。
- USING 子句用于指定要與目標(biāo)聯(lián)接的數(shù)據(jù)源祝蝠。
- ON 子句用于指定決定目標(biāo)與源的匹配位置的聯(lián)接條件。
- WHEN 子句(WHEN MATCHED幻碱、WHEN NOT MATCHED BY TARGET 和 WHEN NOT MATCHED BY SOURCE)基于 ON 子句的結(jié)果和在 WHEN 子句中指定的任何其他搜索條件指定所要采取的操作绎狭。
- OUTPUT 子句針對插入、更新或刪除的目標(biāo)中的每一行返回一行褥傍。
源中的行基于在 ON 子句中指定的聯(lián)接謂詞與目標(biāo)中的行進行匹配儡嘶。結(jié)果是合并后的輸入流。對于每個輸入行恍风,會執(zhí)行一個插入蹦狂、更新或刪除操作誓篱。根據(jù)在語句中指定的 WHEN 子句,輸入行可能是以下內(nèi)容之一:
- 由來自目標(biāo)的一個行和來自源的一個行組成的一個匹配對凯楔。這是 WHEN MATCHED 子句的結(jié)果窜骄。
- 來自源的一個行,在目標(biāo)中沒有與之對應(yīng)的行啼辣。這是 WHEN NOT MATCHED BY TARGET 子句的結(jié)果啊研。
- 來自目標(biāo)的一個行,在源中沒有與之對應(yīng)的行鸥拧。這是 WHEN NOT MATCHED BY SOURCE 子句的結(jié)果党远。
- MERGE INTO - 數(shù)據(jù)的目的地,將數(shù)據(jù)最終 MERGE 到的表對象
- USING 與源表連接 ON 關(guān)聯(lián)的條件
- WHEN MATCHED - 如果匹配成功富弦,即關(guān)聯(lián)條件成功 (這時就應(yīng)該將 SOURCE 中其它的所有字段值更新到 TARGET 表中)
- WHEN NOTMATCHED BY TARGET - 如果匹配不成功 (TARGET 中沒有這一條記錄但是 SOURCE 表有沟娱,說明 SOURCE 表多了新數(shù)據(jù)因此應(yīng)該插入到 TARGET 表中)
- WHEN NOTMATCHED BY SOURCE - 如果匹配不成功 (SOURCE 中沒有這一條記錄但是 TARGET 表有,說明 SOURCE 表可能把這條數(shù)據(jù)刪除了腕柜,所以 TARGET 也應(yīng)該刪除)
MERGE INTO dbo.tbCRM_Customer_Template_Condition T --T目標(biāo)表(被操作济似,被更新,添加,刪除)
USING ( SELECT DISTINCT * FROM #Customer_Template_Condition ) S --S源表(匹配的數(shù)據(jù)源表)
ON T.Template_ID = S.Template_ID
AND T.Field_Name = S.Field_Name
AND T.Operator_Text=S.Operator_Text
AND T.Field_Value=S.Field_Value
AND T.Field_Text=S.Field_Text
--S源表與T目標(biāo)表匹配時,則跟新匹配的數(shù)據(jù)到T目標(biāo)表中
WHEN MATCHED THEN
UPDATE SET Operator_Text = S.Operator_Text ,
Field_Value = S.Field_Value ,
Field_Text = S.Field_Text
--S源表與T目標(biāo)表不匹配時——則插入到目標(biāo)表中盏缤;插入到表中的行是源表中目標(biāo)表中沒有匹配行的行
WHEN NOT MATCHED BY TARGET THEN
INSERT ( Template_ID ,
Field_Name ,
Operator_Text ,
Field_Value ,
Field_Text
)
VALUES ( S.Template_ID ,
S.Field_Name ,
S.Operator_Text ,
S.Field_Value ,
S.Field_Text
)
--T目標(biāo)表與S源表不匹配時——則從目標(biāo)表中刪除與源表中不匹配的行
WHEN NOT MATCHED BY SOURCE AND T.Template_ID={0} THEN
DELETE
Private Function Modify(request As HttpRequest, Template_ID As String)
Dim dt = CRM.Common.JSONHepler.FromJsonTo(Of DataTable)(request("date"))
If dt.Rows.Count > 0 Then
If dt.Rows(0)("Template_ID").ToString() = "" Then
For i As Integer = 0 To dt.Rows.Count - 1
dt.Rows(i)("Template_ID") = Template_ID
Next
End If
End If
Dim tempTable As New Rdp.Core.TempTableModel
tempTable = New Rdp.Core.TempTableModel()
tempTable.Name = "#Customer_Template_Condition"
tempTable.Structure = String.Format(<xml>
CREATE TABLE #Customer_Template_Condition
(
[Template_ID] [SMALLINT] NOT NULL DEFAULT ( '0' ) ,
[Field_Name] [VARCHAR](100) NOT NULL DEFAULT ( '' ) ,
[Operator_Text] [NVARCHAR](20) NOT NULL DEFAULT ( '' ) ,
[Field_Value] [NVARCHAR](MAX) NOT NULL DEFAULT ( '' ) ,
[Field_Text] [NVARCHAR](MAX) NOT NULL DEFAULT ( '' )
);</xml>.Value)
tempTable.Data = dt
Dim Sql = String.Format(<xml>
MERGE INTO dbo.tbCRM_Customer_Template_Condition T
USING ( SELECT DISTINCT * FROM #Customer_Template_Condition ) S
ON T.Template_ID = S.Template_ID
AND T.Field_Name = S.Field_Name
AND T.Operator_Text=S.Operator_Text
AND T.Field_Value=S.Field_Value
AND T.Field_Text=S.Field_Text
WHEN MATCHED THEN
UPDATE SET Operator_Text = S.Operator_Text ,
Field_Value = S.Field_Value ,
Field_Text = S.Field_Text
WHEN NOT MATCHED BY TARGET THEN
INSERT ( Template_ID ,
Field_Name ,
Operator_Text ,
Field_Value ,
Field_Text
)
VALUES ( S.Template_ID ,
S.Field_Name ,
S.Operator_Text ,
S.Field_Value ,
S.Field_Text
)
WHEN NOT MATCHED BY SOURCE AND T.Template_ID={0} THEN
DELETE ;</xml>.Value, Template_ID)
Dim result = Rdp.Core.Data.DbHelperSql.ExecuteSql(CRM.DBUtility.DbHelperSql.CrmQuery, Sql, Nothing, CommandTypes.Query, tempTable, 600)
Return result
End Function