Une autre solution que j'aime bien exploite le véritable résultat booléen à deux valeurs de EXISTS combiné à INTERSECT. Cette solution devrait fonctionner dans SQL Server 2005+.
Comme documenté, INTERSECT traite deux valeurs NULL comme égales, donc si les deux sont NULL, alors INTERSECT donne une seule ligne, donc EXISTS donne vrai.
Cette approche est beaucoup plus concise si vous avez plusieurs colonnes annulables que vous devez comparer dans deux tables. Par exemple, pour renvoyer les lignes de la TableB dont les valeurs de Col1, Col2 ou Col3 sont différentes de celles de la TableA, on peut utiliser la méthode suivante :
SELECT *
FROM TableA A
INNER JOIN TableB B ON A.PK = B.PK
WHERE NOT EXISTS(
SELECT A.Col1, A.Col2, A.Col3
INTERSECT
SELECT B.Col1, B.Col2, B.Col3);
Paul White explique cette solution de contournement plus en détail : https://sql.kiwi/2011/06/undocumented-query-plans-equality-comparisons.html