SQLServer 2008 에서 SQL 증강 의 3 Merge(한 문장 에 Insert,Update,Delete 사용)
기능:원본 표 와 연 결 된 결과 에 따라 대상 표 에 삽입,업데이트 또는 삭제 작업 을 수행 합 니 다.예 를 들 어 다른 표 에서 찾 은 차이 에 따라 한 표 에 줄 을 삽입 하거나 업데이트 하거나 삭제 하면 두 표를 동기 화 할 수 있다.
우 리 는 하나의 예 를 보 자.만약 에 전체 제품 목록,하나의 지점 제품 목록 이 있다 면 지점 에서 제품 을 추가 할 때 전체 제품 목록 을 업데이트 해 야 한다.
총 제품 표,지점 제품 표 구조 가 완전히 일치 합 니 다.
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 억,즉 정형 의 최대 범 위 를 넘 으 면 후 자 를 사용 하 세 요.초승달 주:본 고의 판권 은 초승달 과 블 로그 원 이 공동으로 소유 하고 전재 할 때 출처 를 밝 혀 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laradock에서 Laravel + SQLServer 환경 준비본 기사는 공식 문서의 신규 작성용의 프로젝트 순서에 따라, 다음의 디렉토리 구성이 된다고 가정합니다. 기본 설정 APP_CODE_PATH_HOST에 작성하려는 프로젝트 이름을 입력하십시오. SQL Server용 설...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.