[英]SQL Merge statement not working in Stored Procedure
The following code does not seem to work. 以下代码似乎不起作用。 If the address does not exist, it does not insert the new record. 如果该地址不存在,则不会插入新记录。 However, if the address does exist, it does get updated. 但是,如果地址确实存在,则会更新。
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);
Your Source shouldn't rely upon the target table. 您的来源不应该依赖目标表。 Try instead: 尝试改为:
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);
At the moment, you're creating a zero-row Source
rowset, so of course nothing happens in the merge. 目前,您正在创建零行Source
行集,因此合并中没有任何反应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.