【原创】SQL SERVER中的不同表结构的同步(插入/更新)
最近有个项目需要用Windows Service来提取几个数据库中的数据来插入另一个数据库以供另一套平台使用。
在这个WinService中接收DataTable,DataTable是由另外几个库提供的有需数据字段数据集。
需求:第一次数据,完全插入。以后每次抽取这几个库的数据都需要判断,如果数据已经存在就更新,不在则插入。
第一次把这个判断放在了程序中。但是每条都需要判断是否已经存在,然后再更新或插入。初步测试8万条数据,那是相当的慢。
现在把这个过程放到数据库端去运行:
SQL 操作语句如下例:
Code
create table Temp1
(
ID int,
[NAME] varchar(10)
)
create table Temp2
(
ID int,
[NAME] varchar(10)
)
drop table Temp1,Temp2
insert into Temp1 values(1,'job')
insert into Temp1 values(2,'mark')
insert into Temp1 values(3,'john')
insert into Temp1 values(4,'joy')
insert into Temp1 values(5,'may')
insert into Temp2 values(1,'bob')
insert into Temp2 values(2,'mark')
insert into Temp2 values(3,'summer')
insert into Temp2 values(7,'spring')
insert into Temp2 values(8,'jay')
select * from Temp1
select * from Temp2
update Temp1
set NAME = b.NAME
from
Temp1 a
join
Temp2 b on a.ID=b.ID
insert into Temp1
select a.ID,a.NAME from Temp2 as a
left join Temp1 as b on a.NAME = b.NAME
where b.NAME is null
现在还有另一种解决方案,下次会把效率对比和详细方法补齐。create table Temp1
(
ID int,
[NAME] varchar(10)
)
create table Temp2
(
ID int,
[NAME] varchar(10)
)
drop table Temp1,Temp2
insert into Temp1 values(1,'job')
insert into Temp1 values(2,'mark')
insert into Temp1 values(3,'john')
insert into Temp1 values(4,'joy')
insert into Temp1 values(5,'may')
insert into Temp2 values(1,'bob')
insert into Temp2 values(2,'mark')
insert into Temp2 values(3,'summer')
insert into Temp2 values(7,'spring')
insert into Temp2 values(8,'jay')
select * from Temp1
select * from Temp2
update Temp1
set NAME = b.NAME
from
Temp1 a
join
Temp2 b on a.ID=b.ID
insert into Temp1
select a.ID,a.NAME from Temp2 as a
left join Temp1 as b on a.NAME = b.NAME
where b.NAME is null