2013-07-31 3 views
3

다음 코드는 작동하지 않습니다. 주소가 없으면 새 레코드가 삽입되지 않습니다. 그러나 주소가 존재하면 업데이트됩니다.SQL 병합 문이 저장 프로 시저에서 작동하지 않습니다.

ALTER PROCEDURE [Users].[UpdateAddress] 
    @UserId int, 
    @Address1 varchar(100), 
    @Address2 varchar(100), 
    @Town varchar(100), 
    @County varchar(50), 
    @PostCode varchar(50), 
    @Country varchar(50), 
    @Type INT 
AS 

MERGE [Users].[Addresses] AS Target 
USING (SELECT UserId FROM [Users].[Addresses] WHERE UserId = @UserId) AS Source 
ON (Source.UserId = Target.UserId) 

WHEN MATCHED THEN 
    UPDATE SET Target.Address1 = @Address1, 
    Target.Address2 = @Address2, 
    Target.Town = @Town, 
    Target.County = @County, 
    Target.Postcode = @Postcode, 
    Target.Country = @Country 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT ([UserId], [Address1], [Address2], [Town], [County], [PostCode], [Country], [Modified], [Type]) 
    VALUES(@UserId, @Address1, @Address2, @Town, @County, @PostCode, @Country, GetDate(), @Type); 

답변

14

소스는 목표 테이블에 의존해서는 안됩니다. 대신보십시오 : 순간

MERGE [Users].[Addresses] AS Target 
USING (select @UserID,@Address1,@Address2,@Town,@County,@PostCode,@Country,@Type) 
    AS Source (UserID,Address1,Address2,Town,County,PostCode,Country,Type) 
ON (Source.UserId = Target.UserId) 
WHEN MATCHED THEN 
    UPDATE SET Target.Address1 = Source.Address1, 
    Target.Address2 = Source.Address2, 
    Target.Town = Source.Town, 
    Target.County = Source.County, 
    Target.Postcode = Source.Postcode, 
    Target.Country = Source.Country 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT ([UserId], [Address1], [Address2], [Town], [County], [PostCode], [Country], [Modified], [Type]) 
    VALUES(Source.UserId, Source.Address1, Source.Address2, Source.Town, Source.County, Source.PostCode, Source.Country, GetDate(), Source.Type); 

물론 아무것도 병합으로 발생하지의 있도록, 제로 행 Source 행 집합을 만들고 있습니다.

+0

Perfect! 감사 – ChrisBint

관련 문제