SQL Server2008 Merge应用实例(Merge执行统计库存,复制表,输出$action列 ,output...INTO..)

本文主要是介绍SQL Server2008 Merge应用实例(Merge执行统计库存,复制表,输出$action列 ,output...INTO..),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

--SQL Server2008 Merge应用实例 
/********************************************************************************        
*主题:SQL Server2008 Merge应用实例 
*说明:本文是个人学习的一些笔记和个人愚见        
*      有很多地方你可能觉得有异议,欢迎一起讨论        
*作者:Stephenzhou(阿蒙)        
*日期: 2012.12.5
*Mail:szstephenzhou@163.com        
*另外:转载请著名出处。        
**********************************************************************************/    


先不解释 看实例吧

有两个表如下

 

 

if OBJECT_ID('Stock') is not null
drop table Stock 
go
create table Stock (Symbol varchar(10) primary key,Qty int check(Qty>0))
if OBJECT_ID('Trade') is not null
drop table Trade 
go
create table Trade (Symbol varchar(10) primary key,Delta int check(Delta<>0))
--两个表,第一个表Stock为库存表  ,Trade为交易记录表

--库存表的记录为:

insert into Stock values('ADVW',10)
insert into Stock values('BYA',5)



--增加三条交易记录,

insert into Trade values('ADVW',5)
insert into Trade values('BYA',-5)
insert into Trade values('NWT',3)


查询两表的内容


select * from Stock
select * from Trade

Symbol     Qty
---------- -----------
ADVW       10
BYA        5
(2 行受影响)
Symbol     Delta
---------- -----------
ADVW       5
BYA        -5
NWT        3
(3 行受影响)

 

在交易的时候就应该会影响到库存,这时候就用了merge 。等下我们还要用传统方法来处理然后对比下

 


 

merge Stock 
using Trade
on Stock.Symbol=Trade.Symbol
when matched and (Stock.Qty+Trade.Delta=0) then --就是如果交易和库存一样的话就删除这条记录
DELETE
when matched then 
UPDATE SET Stock.Qty+=Trade.Delta  --有交易也在库存里有 就减去交易
when not matched then 
insert values(Trade.Symbol,Trade.Delta);  --有交易没有库存的就加到库存里
select * from Stock
select * from Trade
Symbol     Qty
---------- -----------
ADVW       15
NWT        3
(2 行受影响)
Symbol     Delta
---------- -----------
ADVW       5
BYA        -5
NWT        3
(3 行受影响)


 

使用Merge进行表复制

  生成两个表,在存储过程执行一次复制一次

 

create table Original(PK int primary key ,Fname varchar(10),Number int)
create table Replica(PK int primary key ,Fname varchar(10),Number int)
create procedure uspSyncReplica
as
Merge Replica r using Original o on o.PK=r.PK
WHEN MATCHED AND (o.Fname!=r.Fname or o.Number!=r.Number) then 
update set r.Fname=o.Fname , r.Number=o.Number
when  not matched then 
insert values(o.PK,o.Fname,o.Number)
when not matched by source then
delete;
INSERT INTO Original VALUES(1,'Stephen',10)
INSERT INTO Original VALUES(2,'Jack',20)
INSERT INTO Original VALUES(3,'BEILL',30)
select *from Original
select *from Replica
/*
PK          Fname      Number
----------- ---------- -----------
1           Stephen    10
2           Jack       20
3           BEILL      30
(3 行受影响)
PK          Fname      Number
----------- ---------- -----------
(0 行受影响)
*/
EXECUTE uspSyncReplica 
/*
(3 行受影响)
*/
select *from Original
select *from Replica
/*
PK          Fname      Number
----------- ---------- -----------
1           Stephen    10
2           Jack       20
3           BEILL      30
(3 行受影响)
PK          Fname      Number
----------- ---------- -----------
1           Stephen    10
2           Jack       20
3           BEILL      30
(3 行受影响)
*/


 

在上面的存储过程执行一次复制一次    使用$action虚拟列查询MERGE输出如下

  
alter procedure uspSyncReplica
as
Merge Replica r using Original o on o.PK=r.PK
WHEN MATCHED AND (o.Fname!=r.Fname or o.Number!=r.Number) then 
update set r.Fname=o.Fname , r.Number=o.Number
when  not matched then 
insert values(o.PK,o.Fname,o.Number)
when not matched by source then
delete 
output $action ,inserted.*,deleted.*;
INSERT INTO Original VALUES(1,'Stephen',10)
INSERT INTO Original VALUES(2,'Jack',20)
INSERT INTO Original VALUES(3,'BEILL',30)
select *from Original
select *from Replica


 

EXECUTE uspSyncReplica 

$action    PK          Fname      Number      PK          Fname      Number ---------- ----------- ---------- ----------- ----------- ---------- ----------- INSERT     1           Stephen    10          NULL        NULL       NULL INSERT     2           Jack       20          NULL        NULL       NULL INSERT     3           BEILL      30          NULL        NULL       NULL

(3 行受影响)


 

查询复制后的表

PK          Fname      Number
----------- ---------- -----------
1           Stephen    10
2           Jack       20
3           BEILL      30
(3 行受影响)
PK          Fname      Number
----------- ---------- -----------
1           Stephen    10
2           Jack       20
3           BEILL      30
(3 行受影响)


 

如:有一个表 customer, 现在要用一个procedure过程,插入数据,如果表customer中有条数据就更新,没有就新增。

 

if OBJECT_ID('customer')is not null
drop table customer
go
create table customer(
Customerid int primary key,
Firstname varchar(30),
Lastname varchar(30),
Balance decimal
)
create procedure usUpsertCustomer 
(
@Customerid int  ,
@Firstname varchar(30),
@Lastname varchar(30),
@Balance decimal
)as
merge customer c 
using 
(select @Customerid  as Customerid ,@Firstname as  Firstname  ,@Lastname  as  Lastname ,@Balance as  Balance)p 
on  c.Customerid=p.Customerid
when not matched then 
insert values(p.Customerid,p.Firstname,p.Lastname,p.Balance)
when matched  then 
update set c.Customerid=p.Customerid,c.Firstname=p.Firstname,c.Balance=p.Balance
output $action,deleted.*,inserted.*;
execute usUpsertCustomer 1,'Stephen','Zhou',10
/*
$action    Customerid  Firstname                      Lastname                       Balance                                 Customerid  Firstname                      Lastname                       Balance
---------- ----------- ------------------------------ ------------------------------ --------------------------------------- ----------- ------------------------------ ------------------------------ ---------------------------------------
UPDATE     1           Stephen                        Zhou                           10                                      1           Stephen                        Zhou                           10
(1 行受影响)
*/
select * from customer
/*
Customerid  Firstname                      Lastname                       Balance
----------- ------------------------------ ------------------------------ ---------------------------------------
1           Stephen                        Zhou                           10
(1 行受影响)
*/
execute usUpsertCustomer 1,'Stephen','Jack',20
/*
$action    Customerid  Firstname                      Lastname                       Balance                                 Customerid  Firstname                      Lastname                       Balance
---------- ----------- ------------------------------ ------------------------------ --------------------------------------- ----------- ------------------------------ ------------------------------ ---------------------------------------
UPDATE     1           Stephen                        Zhou                           10                                      1           Stephen                        Zhou                           20
(1 行受影响)
*/
select * from customer
/*
Customerid  Firstname                      Lastname                       Balance
----------- ------------------------------ ------------------------------ ---------------------------------------
1           Stephen                        Zhou                           20
(1 行受影响)
*/


 

 

以上基本上介绍了下merge的使用 现在把这个联合 output...into...

 

 

create table book (
isbn varchar(20) primary key ,
price decimal,
shelf int
)
create table weeklychange(
isbn varchar(20) primary key,
price decimal,
shelf int
)
create table bookhistory(
[Action] nvarchar(10),
newISBN varchar(20),
newprice decimal,
newshelf int,
oldisbn varchar(20),
oldprice decimal,
oldshelf int,
archivedat datetime2
)
create procedure uspupdatebooks as 
begin
merge book b using weeklychange w on b.isbn=w.isbn 
when not matched then 
insert values (w.isbn,w.price,w.shelf)
when matched and (w.isbn!=b.isbn or w.price!=b.price or w.shelf!=b.shelf) then 
update set b.isbn=w.isbn , b.price=w.price,b.shelf=w.shelf
output $action,inserted.*,deleted.*,sysdatetime() into bookhistory;
end
insert into weeklychange values('SQL程序设计',89,1)
select * from book
select * from weeklychange
select * from bookhistory
/*
isbn                 price                                   shelf
-------------------- --------------------------------------- -----------
(0 行受影响)
isbn                 price                                   shelf
-------------------- --------------------------------------- -----------
SQL程序设计              89                                      1
(1 行受影响)
Action     newISBN              newprice                                newshelf    oldisbn              oldprice                                oldshelf    archivedat
---------- -------------------- --------------------------------------- ----------- -------------------- --------------------------------------- ----------- ----------------------
(0 行受影响)
*/
execute uspupdatebooks
select * from book
select * from weeklychange
select * from bookhistory
/*
isbn                 price                                   shelf
-------------------- --------------------------------------- -----------
SQL程序设计              89                                      1
(1 行受影响)
isbn                 price                                   shelf
-------------------- --------------------------------------- -----------
SQL程序设计              89                                      1
(1 行受影响)
Action     newISBN              newprice                                newshelf    oldisbn              oldprice                                oldshelf    archivedat
---------- -------------------- --------------------------------------- ----------- -------------------- --------------------------------------- ----------- ----------------------
INSERT     SQL程序设计              89                                      1           NULL                 NULL                                    NULL        2012-12-05 14:19:12.29
(1 行受影响)
*/


 

 

 

 

 

 

 

 *作者:Stephenzhou(阿蒙)     
 *日期: 2012.12.5
 *Mail:szstephenzhou@163.com     
 *另外:转载请著名出处。
 *博客地址:http://blog.csdn.net/szstephenzhou

 

 

这篇关于SQL Server2008 Merge应用实例(Merge执行统计库存,复制表,输出$action列 ,output...INTO..)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/786050

相关文章

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

mysql外键创建不成功/失效如何处理

《mysql外键创建不成功/失效如何处理》文章介绍了在MySQL5.5.40版本中,创建带有外键约束的`stu`和`grade`表时遇到的问题,发现`grade`表的`id`字段没有随着`studen... 当前mysql版本:SELECT VERSION();结果为:5.5.40。在复习mysql外键约

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

SQL注入漏洞扫描之sqlmap详解

《SQL注入漏洞扫描之sqlmap详解》SQLMap是一款自动执行SQL注入的审计工具,支持多种SQL注入技术,包括布尔型盲注、时间型盲注、报错型注入、联合查询注入和堆叠查询注入... 目录what支持类型how---less-1为例1.检测网站是否存在sql注入漏洞的注入点2.列举可用数据库3.列举数据库

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2