SQLxxxx-Fehler sind keine Antwortfehler. Somit zieht das nicht.
Um also DUPKEY-Fehler auszuschließen musst du einen " where not exists (select * from dest where sorce.key = dest.key) " hinzufügen.

ERRLVL(40) funktioniert nur, wenn du mehrere Befehle in der SRC hast. Dann wird beim Abbruch eines SQL's der nächste trotzdem ausgeführt.

Es liegt leider im SQL begründet, dass dieser beendet wird, sollte ein Fehler auftreten.