• Here is a small script and the result from them is not the same based on the suggestions in BOL.

    Merge both tables but update column [c2] in the target only if c2 = 'C'.

    SET NOCOUNT ON;

    USE tempdb;

    GO

    DECLARE @T1 TABLE (

    c1 int NOT NULL PRIMARY KEY,

    c2 varchar(15) NOT NULL

    );

    DECLARE @T2 TABLE (

    c1 int NOT NULL PRIMARY KEY,

    c2 varchar(15) NOT NULL UNIQUE

    );

    INSERT INTO @T1 (c1, c2)

    VALUES (1, 'A'), (2, 'C');

    INSERT INTO @T2 (c1, c2)

    VALUES (1, 'AA'), (2, 'B'), (3, 'C');

    SELECT * FROM @T1;

    SELECT * FROM @T2;

    MERGE INTO @T1 AS T1

    USING @T2 AS T2

    ON T1.c1 = T2.c1 AND T1.c2 = 'C'

    WHEN MATCHED THEN

    UPDATE SET T1.c2 = T2.c2

    WHEN NOT MATCHED BY SOURCE THEN

    DELETE

    WHEN NOT MATCHED BY TARGET THEN

    INSERT (c1, c2) VALUES (T2.c1, T2.c2);

    SELECT * FROM @T1;

    SELECT * FROM @T2;

    GO

    SET NOCOUNT ON;

    USE tempdb;

    GO

    DECLARE @T1 TABLE (

    c1 int NOT NULL PRIMARY KEY,

    c2 varchar(15) NOT NULL

    );

    DECLARE @T2 TABLE (

    c1 int NOT NULL PRIMARY KEY,

    c2 varchar(15) NOT NULL UNIQUE

    );

    INSERT INTO @T1 (c1, c2)

    VALUES (1, 'A'), (2, 'C');

    INSERT INTO @T2 (c1, c2)

    VALUES (1, 'AA'), (2, 'B'), (3, 'C');

    SELECT * FROM @T1;

    SELECT * FROM @T2;

    MERGE INTO @T1 AS T1

    USING @T2 AS T2

    ON T1.c1 = T2.c1

    WHEN MATCHED AND T1.c2 = 'C' THEN

    UPDATE SET T1.c2 = T2.c2

    WHEN NOT MATCHED BY SOURCE THEN

    DELETE

    WHEN NOT MATCHED BY TARGET THEN

    INSERT (c1, c2) VALUES (T2.c1, T2.c2);

    SELECT * FROM @T1;

    SELECT * FROM @T2;

    GO

    Notice that in the first script we still update the tuple (1, 'A') even though there is no match by the conditions expressed as part of the ON subclause.

    What BOL is enphasizing is that in the ON clasue we should use just the columns that relate both sets and any extra condition should be used in the <clause_search_condition> part of the subbranches.