Ответ 1
Сравнение COALESCE и ISNULL
Функция ISNULL и выражение COALESCE имеют сходную цель, но могут вести себя по-разному.
- Поскольку ISNULL является функцией, она оценивается только один раз. Как описано выше, входные значения для выражения COALESCE могут быть оценены несколькими раз.
- Определение типа данных для полученного выражения другой. ISNULL использует тип данных первого параметра, COALESCE следует правилам выражения CASE и возвращает тип данных значения с наивысшим приоритетом.
- NULLability выражения результата отличается для ISNULL и COALESCE. Возвращаемое значение ISNULL всегда считается NOT NULLable (при условии, что возвращаемое значение является non-nullable), тогда как COALESCE с ненулевыми параметрами считается NULL. Таким образом, выражения ISNULL (NULL, 1) и COALESCE (NULL, 1), хотя эквивалент имеет различную нулеустойчивость значения. Это имеет значение, если вы используете эти выражения в вычисляемые столбцы, создание ключевых ограничений или создание возвращаемого значения скалярного UDF детерминированного, так что его можно индексировать, как показано в следующий пример.
> USE tempdb;
> GO
> -- This statement fails because the PRIMARY KEY cannot accept NULL values
> -- and the nullability of the COALESCE expression for col2
> -- evaluates to NULL.
> CREATE TABLE #Demo ( col1 integer NULL, col2 AS COALESCE(col1, 0) PRIMARY KEY, col3 AS ISNULL(col1, 0) );
>
> -- This statement succeeds because the nullability of the
> -- ISNULL function evaluates AS NOT NULL.
>
> CREATE TABLE #Demo ( col1 integer NULL, col2 AS COALESCE(col1, 0),
> col3 AS ISNULL(col1, 0) PRIMARY KEY );
Проверки для ISNULL и COALESCE также различны. Например, значение NULL для ISNULL является преобразованный в int, тогда как для COALESCE вы должны указать тип данных. ISNULL принимает только 2 параметра, тогда как COALESCE принимает переменную количество параметров.
Источник: BOL