Думаю, так будет лучше ...
DECLARE @VarA TABLE
(
id INT IDENTITY(1,1) PRIMARY KEY,
Name nVARCHAR(100),
refId INT,
value INT,
KPI INT
)
DECLARE @VarB TABLE
(
id INT IDENTITY(5,1) PRIMARY KEY,
Name nVARCHAR(100),
value INT
)
DECLARE @output TABLE
(
id INT,
Name nVARCHAR(100)
)
INSERT INTO @VarA
(Name, refId, value, KPI)
VALUES
('ahmed',550,50, 30),
('ali', NULL, 30, NULL),
('soo', 561,40, 30)
INSERT INTO @VarB
(Name, value)
VALUES
('ahmed', 50),
('soo', 30)
MERGE INTO @VarB AS Target
USING (SELECT Name, Value FROM @VarA) AS Source (Name, Value)
ON Target.Name = Source.Name
WHEN MATCHED THEN
UPDATE SET Value = Source.Value --Do you want to update the value if record exists?
WHEN NOT MATCHED BY TARGET THEN
INSERT (Name, Value) VALUES (Name, Value)
OUTPUT inserted.ID, inserted.Name INTO @output(ID, Name);
UPDATE a SET refId = o.ID FROM @VarA a
INNER JOIN @output o ON o.Name = a.Name
SELECT * FROM @VarA