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.mzph.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…