Erwähnenswert ist, dass die Typbehandlung zwischen den beiden ebenfalls einen Unterschied machen kann (siehe diesen zugehörigen Antwortpunkt (2) ).
Angenommen, eine Abfrage versucht, eine Verknüpfung zum Schreiben eines Nullvergleichs zu verwenden:
select * from SomeTable
where IsNull(SomeNullableBitField, -1) != IsNull(SomeOtherNullableBitField, -1);
das ist anders als
select * from SomeTable
where coalesce(SomeNullableBitField, -1) != coalesce(SomeOtherNullableBitField, -1);
Denn im ersten Fall erzwingt IsNull (), dass der Typ ein Bit ist (also wird -1 in true konvertiert), während im zweiten Fall beide zu einem int heraufgestuft werden.
with input as
(
select convert(bit, 1) as BitOn,
convert(bit, 0) as BitOff,
convert(bit, null) as BitNull
)
select BitOn,
BitOff,
BitNull,
IsNull(BitOn, -1) IsNullBitOn,
IsNull(BitOff, -1) IsNullBitOff,
IsNull(BitNull, -1) IsNullBitNull,
coalesce(BitOn, -1) CoalesceBitOn,
coalesce(BitOff, -1) CoalesceBitOff,
coalesce(BitNull, -1) CoalesceBitNull
from input;
Es gibt einen ähnlichen Kommentar / Link (@Martin Smith) zu der Frage selbst.