SQLServer 2008 에서 SQL 증강 의 3 Merge(한 문장 에 Insert,Update,Delete 사용)

6093 단어 SQLServerMerge
SQL Server 2008 은 MSDN:http://msdn.microsoft.com/zh-cn/library/bb510625.aspx을 참조 하여 강 화 된 SQL 명령 Merge 를 제공 합 니 다.
기능:원본 표 와 연 결 된 결과 에 따라 대상 표 에 삽입,업데이트 또는 삭제 작업 을 수행 합 니 다.예 를 들 어 다른 표 에서 찾 은 차이 에 따라 한 표 에 줄 을 삽입 하거나 업데이트 하거나 삭제 하면 두 표를 동기 화 할 수 있다.
우 리 는 하나의 예 를 보 자.만약 에 전체 제품 목록,하나의 지점 제품 목록 이 있다 면 지점 에서 제품 을 추가 할 때 전체 제품 목록 을 업데이트 해 야 한다.
총 제품 표,지점 제품 표 구조 가 완전히 일치 합 니 다.
 
if OBJECT_ID('Demo_AllProducts') is not null
drop table Demo_AllProducts
go
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

--this SQL is only for SQL Server 2008
Insert into Demo_AllProducts
(DName,DCode,DDate)
values
('DemoA','AAA',GETDATE()),
('DemoB','BBB',GETDATE()),
('DemoC','CCC',GETDATE()),
('DemoD','DDD',GETDATE()),
('DemoE','EEE',GETDATE())

select * from Demo_AllProducts

--PKID DName DCode DDate
--1 DemoA AAA 2010-10-12 20:33:54.417
--2 DemoB BBB 2010-10-12 20:33:54.417
--3 DemoC CCC 2010-10-12 20:33:54.417
--4 DemoD DDD 2010-10-12 20:33:54.417
--5 DemoE EEE 2010-10-12 20:33:54.417

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

--this SQL is only for SQL Server 2008
Insert into Demo_Shop1_Product
(DName,DCode,DDate)
values
('DemoA','AAA',GETDATE()),
('DemoB','CCC',GETDATE()),
('DemoF','FFF',GETDATE())

select * from Demo_Shop1_Product

--PKID DName DCode DDate
--1 DemoA AAA 2010-10-17 20:19:32.767
--2 DemoB CCC 2010-10-17 20:19:32.767
--3 DemoF FFF 2010-10-17 20:19:32.767
현재 지점 데 이 터 를 전체 제품 표 에 완전히 통합 시 켜 야 한다 고 가정 하고 코드 필드 를 근거 로 제품 이름 이 일치 하지 않 으 면 지점 의 제품 이름 으로 전체 제품 이름 을 교체 합 니 다.총 제품 표 에 존재 하지 않 으 면 추가 합 니 다.옵션:지점 표 에 존재 하지 않 으 면 전체 제품 표 에서 지점 에 없 는 줄 을 삭제 합 니 다.이렇게 되면 총 제품 표 와 지점 표 가 완전히 동기 화 된다.실제 작업 중 대상 표 의 줄 을 삭제 할 필요 가 없 을 수도 있 습 니 다.문 구 는 다음 과 같다.
 
--
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;
이때 실행 이 완 료 된 후 두 표 의 줄 은 모두 다음 과 같다.
 
--PKID DName DCode DDate
--1 DemoA AAA 2010-10-17 20:31:00.827
--2 DemoB CCC 2010-10-17 20:31:00.827
--3 DemoF FFF 2010-10-17 20:31:00.827
삭제 하지 않 으 면 문 구 는 다음 과 같다.
 
--
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);
실행 후 결과:
 
--PKID DName DCode DDate
--1 DemoA AAA 2010-10-17 20:30:28.350
--2 DemoB BBB 2010-10-17 20:30:28.350
--3 DemoB CCC 2010-10-17 20:30:28.350
--4 DemoD DDD 2010-10-17 20:30:28.350
--5 DemoE EEE 2010-10-17 20:30:28.350
--6 DemoF FFF 2010-10-17 20:31:00.827

--PKID DName DCode DDate
--1 DemoA AAA 2010-10-17 20:31:00.827
--2 DemoB CCC 2010-10-17 20:31:00.827
--3 DemoF FFF 2010-10-17 20:31:00.827
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;
결과:
 
--
--Count1 Count2
--5 5

--Deleted
--MPKID PKID DName DCode DDate
--1 NULL NULL NULL NULL
--2 2 DemoB BBB 2010-10-17 21:42:30.700
--3 3 DemoC CCC 2010-10-17 21:42:30.700
--4 4 DemoD DDD 2010-10-17 21:42:30.700
--5 5 DemoE EEE 2010-10-17 21:42:30.700
@@ROWCOUNT 와 ROWCOUNT 에 대하 여BIG()의 더 많은 설명 은 MSDN 을 찾 아 보 세 요.
http://technet.microsoft.com/zh-tw/library/ms187316.aspx  
http://msdn.microsoft.com/en-us/library/ms181406.aspx
영향 결과 가 20 억,즉 정형 의 최대 범 위 를 넘 으 면 후 자 를 사용 하 세 요.초승달 주:본 고의 판권 은 초승달 과 블 로그 원 이 공동으로 소유 하고 전재 할 때 출처 를 밝 혀 주 십시오.

좋은 웹페이지 즐겨찾기