我在接受用戶數據的收集和執行Web服務的SQL PROC如下:WHEN NOT MATCHED BY SOURCE忽略了過濾器
- 如果用戶不存在目標,將其插入
- 如果用戶在目標存在,從源頭
- 任何新的細節更新。如果用戶沒有在源存在,然後將它們歸檔目的地
有一個與最後一個問題( WHEN NOT MATCHED BY SOURCE THEN UPDATE
),表中的每一行都被更新爲archived=1
。我認爲只有customerId
與@customerId
相匹配的行纔會受到影響,但它會更新除ON
中匹配的行以外的所有行,並忽略ON
過濾器。
MERGE
[tbl_Users] AS tgt -- Target
USING
#tbl_working AS src -- Source
ON
(tgt.customerID = @customerId) AND
(tgt.employeeID = src.EmployeeId)
WHEN MATCHED THEN UPDATE SET -- user exists; update
tgt.username = src.username
tgt.name = src.FirstName
WHEN NOT MATCHED BY TARGET THEN INSERT -- user does not exist; create
(
customerID,
username,
name
)
VALUES
(
@customerId,
src.UserName,
src.Name
)
WHEN NOT MATCHED BY SOURCE THEN UPDATE -- user no longer required; archive
SET tgt.archived = 1;
我可能沒有正確使用最後一部分,所以請不勝感激。
你是超級巨星!雖然我不確定。爲什麼要在最後一部分停止該子句,但仍然按照預期的方式應用於'WHEN MATCHED THEN UPDATE'?或者應將此行更新爲'WHEN MATCHED AND tgt.customerID = @customerID THEN UPDATE' – EvilDr
@EvilDr - 我試着添加更多解釋。 –
棒極了。非常感謝你。 – EvilDr