В SQL Server, ако получавате съобщение за грешка Msg 4127, което гласи „Поне един от аргументите за COALESCE трябва да е израз, който не е константа NULL“, това вероятно е защото всичките ви аргументи към COALESCE()
израз са NULL
константа.
За да коригирате този проблем, уверете се, че поне един аргумент не е NULL
константа.
Пример за грешка
Ето пример за код, който произвежда тази грешка:
SELECT COALESCE( null, null );
Получаваме това:
Msg 4127, Level 16, State 1, Line 1 At least one of the arguments to COALESCE must be an expression that is not the NULL constant.
В този случай всички аргументи бяха NULL
константа и така беше върната грешка.
Решение
Решението е лесно. Всичко, което трябва да направим, е да се уверим, че поне един аргумент не е NULL
константа:
SELECT COALESCE(null, 'Cat', 'Dog');
Резултат:
Cat
В този случай Cat
беше първият не-NULL
аргумент и така COALESCE()
върна тази стойност.
Както се вижда тук, е добре да включите NULL
константа като аргумент, стига да има поне още един аргумент, който не NULL
константа.
NULL
Изрази и колони в базата данни
Имайте предвид, че NULL
константата не е същата като израз, който води до NULL
. И това не е същото като колона на база данни, която съдържа NULL
.
Например, ако всички аргументи се позовават на колоните на базата данни и тези колони на базата данни са NULL
, тогава не получаваме грешката.
Да предположим, че изпълняваме следната заявка:
SELECT CustomerId, CustomerCategoryId
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Резултат:
CustomerId CustomerCategoryId ----------- ------------------ NULL NULL
И двете колони съдържат NULL
стойности.
Така че, ако предадем и двете колони на COALESCE()
, получаваме резултат от NULL
:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Резултат:
NULL
Същото е вярно, ако заменим една от колоните с NULL
константа:
SELECT COALESCE( CustomerId, null )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Резултат:
NULL
Така че това е само когато всички аргументите са NULL
константа, че получаваме грешка.