• 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