SQL ServerSQL Server 2008之初报告句merge

SQL Server
2008用富含用于合并两独行集(rowset)数据的初句法。根据一个源数据表对另一个数据表进行明确的插入、更新与去这样复杂的操作,运用新的MERGE语句,开发者用同一久命令就好得。

对少独说明展开信息并时,有三步操作而开展。1、首先使处理外索要插入目标数据表的新行。

                                                           
2、其次是拍卖需创新的早已在的实行。

                                                           
3、最后要删减不再用的旧行。这个进程遭到需维护大量又的逻辑,并可能造成微妙的一无是处。

 

倘您所显现,具体操作是基于后面的协同(join)的辨析结果来确定的。在是事例中,如果目标及源数据表有相当的实施,就实行更新操作。如果没有,就推行插入或者去除操作来如目标数据表和源数据表保持一致。

 

引进几只有关merge使用的篇章

http://www.soaspx.com/dotnet/sql/mssql/sql2008/sqlserver2008_20110531_7693.html

http://hi.baidu.com/zhuyuehua/item/f2f91924e2d9243294f62b4d

 

 

语法:
merge  [into] [目标表]
using <源表> on 条件– 源表可以是大半独数据表Join关联起来的一个表。也可以是一个数据源。
when matched 操作 
when not matched 操作
;

–总结:数据并三步骤原则:存在就是更新,不在就是栽,多余就去。
MERGE INTO dbo.t_UsersThat AS a 
using dbo.t_UsersThis AS b  
ON a.UserCode=b.UserCode
WHEN MATCHED THEN UPDATE SET a.[Password]=b.[Password]  –1、关联匹配后,更新目标表中的涉及记录之字段
WHEN NOT MATCHED  BY source THEN delete                –2、删除目标表中提到不达标之笔录(即是目标表中但是不存储源表中之笔录)
WHEN NOT MATCHED BY Target THEN INSERT (UserCode,[Password]) VALUES (b.UserCode,b.[Password])  –3、将是源本表中之笔录但切莫设有目标表中的记录,插入到目标表中。–关键字可以省略BY Target

–WHEN MATCHED THEN DELETE                              –4、关联匹配后,删除目标表中的涉的记录 
;  –MERGE 语句必须盖分公司(;)结尾。                            

SELECT * FROM dbo.t_UsersThis
SELECT * FROM dbo.t_UsersThat

–以Merge需要小心:
1、此种植共同更新方法极其好是关联字段,一对一底涉及。原表/目标表中的涉及字段非设有双重的。
2、源表中之UserCode只能对应一个还是基本上个目标中之记录.(即一定要部分多之关联)
   
   

 

Merge关键字之片段限量

  •     使用Merge关键字只能更新一个表明
  •     源表中不克出再次的笔录

 否则更新的时节会报错:目标实行及大多单源行匹配时见面现出这种情形。MERGE
语句子无法多次翻新目标表的同一行

可这种情景可以使用sql中之Update关联级联更新目标表,但目标表中为率先久匹配度记录也本。如下图:

SQL Server 1

 

 

 

以下是测试脚本:

原表:t_UserThis

if exists (select * from sysobjects where id = OBJECT_ID(‘[t_UsersThis]’) and OBJECTPROPERTY(id, ‘IsUserTable’) = 1) 
DROP TABLE [t_UsersThis]

CREATE TABLE [t_UsersThis] (
[UserID] [int]  IDENTITY (1, 1)  NOT NULL,
[UserCode] [nvarchar]  (128) NULL,
[Password] [nvarchar]  (128) NULL)

ALTER TABLE [t_UsersThis] WITH NOCHECK ADD  CONSTRAINT [PK_t_UsersThis] PRIMARY KEY  NONCLUSTERED ( [UserID] )
SET IDENTITY_INSERT [t_UsersThis] ON

INSERT [t_UsersThis] ([UserID],[UserCode],[Password]) VALUES ( 1,N’001′,N’4297F44B13955235245B2497399D7A93′)
INSERT [t_UsersThis] ([UserID],[UserCode],[Password]) VALUES ( 7,N’002′,N’4297F44B13955235245B2497399D7A93′)
INSERT [t_UsersThis] ([UserID],[UserCode],[Password]) VALUES ( 8,N’003′,N’4297F44B13955235245B2497399D7A93′)
INSERT [t_UsersThis] ([UserID],[UserCode],[Password]) VALUES ( 9,N’004′,N’4297F44B13955235245B2497399D7A93′)
INSERT [t_UsersThis] ([UserID],[UserCode],[Password]) VALUES ( 11,N’005′,N’4297F44B13955235245B2497399D7A93′)
INSERT [t_UsersThis] ([UserID],[UserCode],[Password]) VALUES ( 14,N’006′,N’1111′)

SET IDENTITY_INSERT [t_UsersThis] OFF

 

目标表:t_UsersThat

 

if exists (select * from sysobjects where id = OBJECT_ID(‘[t_UsersThat]’) and OBJECTPROPERTY(id, ‘IsUserTable’) = 1) 
DROP TABLE [t_UsersThat]

CREATE TABLE [t_UsersThat] (
[UserID] [int]  IDENTITY (1, 1)  NOT NULL,
[UserCode] [nvarchar]  (128) NULL,
[Password] [nvarchar]  (128) NULL)

 

 

相关文章