I would suggest an alternative piece of code in one area you are using. When checking your type 2 attributes for change, you are using a lot of “not equal” checks, and transforming each attribute with a ISNULL.
This type of work falls into an area called “data fingerprinting”: checking to see if the finger print is different or not. Try wrapping the attributes you want checked in a CHECKSUM function, either individually listing each column or the entire record:
CHECKSUM(DST.ClientName, DST.Country, DST.Town,
DST.Address1, DST.Address2, DST.ClientType, DST.ClientSize) <>
CHECKSUM(SRC.ClientName, SRC.Country, SRC.Town,
SRC.Address1, SRC.Address2, SRC.ClientType, SRC.ClientSize)
CHECKSUM(DST.*) <> CHECKSUM(SRC.*)
I typically use the individual fields approach myself.
Beer's Law: Absolutum obsoletum
"if it works it's out-of-date"