SQL Server 2008中SQL增強功能點Merge

sql server 2008提供了一個增強的Sql命令Merge,用法參看MSDN。能根據兩張表數據的不同,對兩張表進行數據執行插入,更新或刪除等操作,一般用在數據的抽取,例如,根據在另一個表中找到的差異在一個表中插入、更新或刪除行,可以對兩張表數據進行同步。

看例子,假如,有一總產品列表,一個分店產品列表,需要從分店添加產品時更新產品列表。

總產品表,分店產品表結構完全一致:

if OBJECT_ID('Demo_AllProducts')is not null 
drop table Demo_AllProductsgo
Create table Demo_AllProducts
(
PKID int not null identity(1,1) primary key,
DName Nvarchar(20) null,
DCode NVarchar(30) null,
DDate datetime null
)
go

創建分店表

if OBJECT_ID('Demo_Shop1_Product') is not null
drop table Demo_Shop1_Product
go
Create table Demo_Shop1_Product
(
PKID int not null identity(1,1) primary key,
DName Nvarchar(20) null,
DCode NVarchar(30) null,
DDate datetime null
)
go

總店錄入數據:

 Insert into Demo_AllProducts(DName,DCode,DDate)
values
('DemoA','AAA',GETDATE()),
('DemoB','BBB',GETDATE()),
('DemoC','CCC',GETDATE()),
('DemoD','DDD',GETDATE()),
('DemoE','EEE',GETDATE())
1    DemoA    AAA    2012-01-29 17:57:34.110
2 DemoB BBB 2012-01-29 17:57:34.110
3 DemoC CCC 2012-01-29 17:57:34.110
4 DemoD DDD 2012-01-29 17:57:34.110
5 DemoE EEE 2012-01-29 17:57:34.110

分店同樣的錄入數據:

 Insert into Demo_Shop1_Product
(DName,DCode,DDate)
values
('DemoA','AAA',GETDATE()),
('DemoB','CCC',GETDATE()),
('DemoF','FFF',GETDATE())
1    DemoA    AAA    2012-01-29 18:01:38.797
2 DemoB CCC 2012-01-29 18:01:38.797
3 DemoF FFF 2012-01-29 18:01:38.797

假定現在需要將分店數據完全合并到總產品表中,以編碼字段為依據,如果產品名稱不一致,則用分店的產品名稱替換總產品名稱。如果總產品表中不存在,則添加。這里要區分下源表是分店表,目標表是總產品表

可選項:如果分店表中不存在,則從總店表中刪除分店中沒有的行,如果這樣,總產品表和分店表就完全同步了。實際操作中可能不需要刪除目標表的行

看語句:

 --確定目標表
merge into Demo_AllProducts p

--從數據源查找編碼相同的產品
using Demo_Shop1_Product s
on p.DCode=s.DCode
--如果編碼相同,則更新目標表的名稱
when Matched and p.DName<>s.DName then update set p.DName=s.DName
--如果目標表中不存在,則從數據源插入目標表中
when not Matched by Target then Insert (DName,DCode,DDate) values (s.DName,s.DCode,s.DDate);

--如果數據源的行在源表中不存在,則刪除源表行
--when not Matched by source then delete;

執行后結果:

7    DemoA    AAA    2012-01-29 18:20:40.477
8 DemoB BBB 2012-01-29 18:20:40.477
9 DemoB CCC 2012-01-29 18:20:40.477
10 DemoD DDD 2012-01-29 18:20:40.477
11 DemoE EEE 2012-01-29 18:20:40.477
12 DemoF FFF 2012-01-29 18:20:48.073

可以看到源表中的數據已經順利的并入到了目標表中,如果需要記錄Merge語句影響的行,可以用output子句,如果僅僅需要知道影響的行數,可以使用@@Rowcount或Rowcount_big(),修改后的實例如下:

 --定義表變量以存儲輸出
Declare @tableVarRecord
Table
(
MPKID int not null identity(1,1) primary key,
PKID int null ,
DName Nvarchar(20) null,
DCode NVarchar(30) null,

DDate datetime null)
--確定目標表
Merge Into Demo_AllProducts p
--從數據源查找編碼相同的產品
using Demo_Shop1_Product s
on p.DCode=s.DCode
--如果編碼相同,則更新目標表的名稱
When Matched and P.DName<>s.DName Then Update set P.DName=s.DName
--如果目標表中不存在,則從數據源插入目標表
When Not Matched By Target Then Insert (DName,DCode,DDate) values (s.DName,s.DCode,s.DDate)
--如果數據源的行在源表中不存在,則刪除源表行
When Not Matched By Source Then Delete
OUTPUT deleted.* INTO @tableVarRecord;
----Delete OUTPUT Inserted.* INTO @tableVarRecord;
--返回上個Merge語句影響的行數
select @@ROWCOUNT as Count1,ROWCOUNT_BIG() as Count2
select * from @tableVarRecord;

?

轉載于:https://www.cnblogs.com/zhijianliutang/archive/2012/01/29/2331383.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377801.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377801.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377801.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Numpy(科學計算庫)---小練習

1&#xff0c;打印當前Numpy版本 import numpy as np print (np.__version__) """ 1.22.3 """2&#xff0c;構造一個全零的矩陣&#xff0c;并打印其占用的內存大小 yy np.zeros((3,3)) yy """ array([[0., 0., 0.],[0., 0., …

【轉】Spark源碼分析之-scheduler模塊

原文地址&#xff1a;http://jerryshao.me/architecture/2013/04/21/Spark%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8B-scheduler%E6%A8%A1%E5%9D%97/ Background Spark在資源管理和調度方式上采用了類似于Hadoop YARN的方式&#xff0c;最上層是資源調度器&#xff0c;它負…

【C++grammar】析構、友元、拷貝構造函數、深淺拷貝

目錄1、Destructor&#xff08;析構函數&#xff09;在堆和棧(函數作用域與內嵌作用域)上分別創建Employee對象&#xff0c;觀察析構函數的行為2、Friend&#xff08;友元&#xff09;1、為何需要友元2、友元函數和友元類3、關于友元的一些問題3、Copy Constructor&#xff08;…

用mstsc /console 強行“踢”掉其它在線的用戶

由于公司有很多windows服務器&#xff0c;而且有很大一部分不在國內&#xff0c;所以經常需要使用遠程桌面進行連接&#xff0c;這其中&#xff0c;就會經常遇到因為超出了最大連接數&#xff0c;而不能連接的事情&#xff0c;其中最頭痛的就是&#xff0c;在連接國外的服務器時…

set vector_Java Vector set()方法與示例

set vector向量類set()方法 (Vector Class set() method) set() method is available in java.util package. set()方法在java.util包中可用。 set() method is used to replace the old element with the given element (ele) when it exists otherwise it sets the given ele…

Android PreferenceActivity 使用

我想大家對于android的系統配置界面應該不會陌生吧&#xff0c;即便陌生&#xff0c;那么下面的界面應該似曾相識吧&#xff0c;假若還是不認識&#xff0c;那么也沒有關系&#xff0c;我們這一節主要就是介紹并講解android 中系統配置界面的使用&#xff0c;相信大家看完本節后…

Pandas(數據分析處理庫)---講解

本內容來自《跟著迪哥學Python數據分析與機器學習實戰》&#xff0c;該篇博客將其內容進行了整理&#xff0c;加上了自己的理解&#xff0c;所做小筆記。若有侵權&#xff0c;聯系立刪。 迪哥說以下的許多函數方法都不用死記硬背&#xff0c;多查API多看文檔&#xff0c;確實&a…

hdu 1141

地址&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1141 題意&#xff1a;atmel公司1960年發布4bits的處理器&#xff0c;每10年翻一番。給一個年份&#xff0c;問最近一次發布的處理器能運算的n!最大的n是多少。 mark&#xff1a;最大的處理器位數是2160年的4194304…

leetcode 78. 子集 思考分析

題目 給定一組不含重復元素的整數數組 nums&#xff0c;返回該數組所有可能的子集&#xff08;冪集&#xff09;。 說明&#xff1a;解集不能包含重復的子集。 思考分析 畫出解空間樹。 我們可以發現我們所需要的結果是解空間的所有結點。而我們之前組合問題和分割問題都是…

PHP checkdate()函數與示例

PHP checkdate()函數 (PHP checkdate() function) checkdate() function is used to check the valid Gregorian dates. It accepts the date and returns Boolean values (True/False) based on the date values. checkdate()函數用于檢查有效的公歷日期。 它接受日期&#xf…

設計模式讀書筆記-----備忘錄模式

個人比較喜歡玩單機游戲&#xff0c;什么仙劍、古劍、鬼泣、使命召喚、三國無雙等等一系列的游戲我都玩過(現在期待凡人修仙傳)&#xff0c;對于這些游戲除了劇情好、場面大、爽快之外&#xff0c;還可以隨時存檔&#xff0c;等到下次想玩了又可以從剛開始的位置玩起(貌似現在的…

【C++grammar】vector類和字符串字面量

C的vector類 用數組存放數據時&#xff0c;容量大小不可變&#xff0c;vector對象容量可自動增大。 vector的操作&#xff1a; 調用push_back函數時&#xff0c;vector對象的容量可能會增大。 觀察下列操作對vector的影響&#xff1a; #include <vector> #include <…

除去數組中的空字符元素array_filter

<?php$str1_arrayarray(電影,,http://www,,1654,);$str1_arrayarray_filter($str1_array);print_r($str1_array); ?>顯示結果&#xff1a;Array( [0] > 電影 [2] > http://www [4] > 1654) 轉載于:https://www.cnblogs.com/skillCoding/archive/20…

date.after方法_Java Date after()方法與示例

date.after方法日期類after()方法 (Date Class after() method) after() method is available in java.util package. after()方法在java.util包中可用。 after() method is used to check whether this date is after the given date (d) or not. after()方法用于檢查此日期是…

Matplotlib(數據可視化庫)---講解

本內容來自《跟著迪哥學Python數據分析與機器學習實戰》&#xff0c;該篇博客將其內容進行了整理&#xff0c;加上了自己的理解&#xff0c;所做小筆記。若有侵權&#xff0c;聯系立刪。 迪哥說以下的許多函數方法都不用死記硬背&#xff0c;多查API多看文檔&#xff0c;確實&a…

找min和max

看到的貌似是阿里的筆試題&#xff0c;題意是一組數&#xff0c;要找到min和max&#xff0c;同時要求時間復雜度&#xff08;比較次數&#xff09;小于2n&#xff08;2n的辦法都想得到&#xff09;。 別人的思路&#xff1a;n個數的數組里看作每兩個一組&#xff0c;若n是奇數&…

Shader Compiler 界面進展1

先從模仿Composer的界面開始. 目前的進展:不用不知道,雖然wxweidgets有很多界面工具如DialogBlocks(DB), 但仍然不好使. 我使用wxAui界面, DialogBlocks并不支持輸出其xrc格式, 我猜是wx本身就沒有解析wxAui的xrc格式.像wxAuiToolBar或其他wxToolBar, DB工具也不能獨立輸出xrc.…

leetcode 90. 子集 II 思考分析

與本題相關聯的題目解析&#xff1a; leetcode 78. 子集 思考分析 leetcode 40. 組合總和 II思考分析 題目 給定一個可能包含重復元素的整數數組 nums&#xff0c;返回該數組所有可能的子集&#xff08;冪集&#xff09;。 說明&#xff1a;解集不能包含重復的子集。 思考 …

java bitset_Java BitSet and()方法與示例

java bitsetBitSet類和()方法 (BitSet Class and() method) and() method is available in java.util package. and()方法在java.util包中可用。 and() method is used to perform logical AND between two Bitset. This bit set is updated so that every bit holds the value…

Redis-主從復制

一、Redis的Replication&#xff1a; 這里首先需要說明的是&#xff0c;在Redis中配置Master-Slave模式真是太簡單了。相信在閱讀完這篇Blog之后你也可以輕松做到。這里我們還是先列出一些理論性的知識&#xff0c;后面給出實際操作的案例。 下面的列表清楚的解釋了Redis…