我有一个看起来像这样的表:
AccountID, ItemID
1, 100
1, 200
2, 300
Run Code Online (Sandbox Code Playgroud)
我有一个proc接受一个表值参数,该参数更新与帐户关联的项目.我们将传递以下内容:
AccountID, ItemID
3, 100
3, 200
Run Code Online (Sandbox Code Playgroud)
proc类似于:
procedure dbo.MyProc( @Items as dbo.ItemListTVP READONLY )
AS
BEGIN
MERGE INTO myTable as target
USING @Items
on (Items.AccountId = target.AccountId)
AND (Items.ItemId = target.ItemId)
WHEN NOT MATCHED BY TARGET THEN
INSERT (AccountId, ItemId)
VALUES (Items.AccountId, Items.ItemId)
;
END
Run Code Online (Sandbox Code Playgroud)
根据传入的数据,我希望它能在表中添加2条新记录.
我想要的是有一个WHEN NOT MATCHED BY SOURCE子句,它将删除不匹配的指定帐户的项目.
例如,如果我通过
AccountID, ItemID
1, 100
1, 400
Run Code Online (Sandbox Code Playgroud)
然后我希望它删除1,200的记录; 但是留下所有其他人.
如果我这样做:
WHEN NOT MATCHED BY SOURCE THEN
DELETE; …Run Code Online (Sandbox Code Playgroud) 来源表
Id, Name, Address
1 A #202
1 A #203
1 A #204
2 A #202
Run Code Online (Sandbox Code Playgroud)
目标表
Id, Name, Address
1 A NULL
Run Code Online (Sandbox Code Playgroud)
合并之后
Id, Name, Address
1 A #202
2 A #202
Run Code Online (Sandbox Code Playgroud)
我正在使用这个SQL
create table #S (ID int, Name varchar(25) NULL, Address varchar(25) NULL)
create table #T (ID int, Name varchar(25) NULL, Address varchar(25) NULL)
INSERT #S values(1, 'A', '#202')
INSERT #S values(1, 'A', '#203')
INSERT #S values(1, 'A', '#203')
INSERT #S values(1, 'A', '#204')
INSERT #T values(1, 'A', …Run Code Online (Sandbox Code Playgroud)