T-SQL 之 MERGE INTO(2)

  • 官網(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載砰蠢,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末唉铜,一起剝皮案震驚了整個濱河市台舱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌潭流,老刑警劉巖竞惋,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異灰嫉,居然都是意外死亡拆宛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門讼撒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浑厚,“玉大人,你說我怎么就攤上這事根盒≌八蹋” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵郑象,是天一觀的道長贡这。 經(jīng)常有香客問我,道長厂榛,這世上最難降的妖魔是什么盖矫? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任丽惭,我火速辦了婚禮,結(jié)果婚禮上辈双,老公的妹妹穿的比我還像新娘责掏。我一直安慰自己,他們只是感情好湃望,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布换衬。 她就那樣靜靜地躺著,像睡著了一般证芭。 火紅的嫁衣襯著肌膚如雪瞳浦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天废士,我揣著相機與錄音叫潦,去河邊找鬼。 笑死官硝,一個胖子當(dāng)著我的面吹牛矗蕊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氢架,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼傻咖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了岖研?” 一聲冷哼從身側(cè)響起没龙,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缎玫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體解滓,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡赃磨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了洼裤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邻辉。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖腮鞍,靈堂內(nèi)的尸體忽然破棺而出值骇,到底是詐尸還是另有隱情,我是刑警寧澤移国,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布吱瘩,位于F島的核電站,受9級特大地震影響迹缀,放射性物質(zhì)發(fā)生泄漏使碾。R本人自食惡果不足惜蜜徽,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望票摇。 院中可真熱鬧拘鞋,春花似錦、人聲如沸矢门。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祟剔。三九已至隔躲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間峡扩,已是汗流浹背蹭越。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留教届,地道東北人响鹃。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像案训,于是被迫代替她去往敵國和親买置。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354