Just to expand on Jack's point a bit, because it is an important one:
COALESCE( expression [ ,...n ] ) returns the data type of the expression with the highest data type precedence.
ISNULL(check_expression, replacement_value) returns the same type as check_expression.
So:
SELECT ISNULL(CAST(NULL AS INT), 5.5) -- Returns 5
SELECT COALESCE(CAST(NULL AS INT), 5.5) -- Returns 5.5
SELECT DATALENGTH(ISNULL(CAST(NULL AS VARCHAR(5)), N'Hello')) -- Returns 5
SELECT DATALENGTH(COALESCE(CAST(NULL AS VARCHAR(5)), N'Hello')) -- Returns 10
Paul White
SQLPerformance.com
SQLkiwi blog
@SQL_Kiwi