Ако получите съобщение за грешка 4151 „Типът на първия аргумент за NULLIF не може да бъде константа NULL, тъй като типът на първия аргумент трябва да е известен ” в SQL Server, това е, защото предавате нулева стойност като първи аргумент на NULLIF()
функция.
За да коригирате тази грешка, уверете се, че не предавате нулевата константа като първи аргумент на функцията. Или ако го направите, тогава го преобразувайте в конкретен тип данни.
Пример за грешката
Ето пример за код, който създава грешката:
SELECT NULLIF(null, 7);
Резултат:
Msg 4151, Level 16, State 1, Line 1 The type of the first argument to NULLIF cannot be the NULL constant because the type of the first argument has to be known.
В SQL Server, NULLIF()
връщаната стойност на функцията използва типа данни на първия израз. Това означава, че първата стойност не трябва да бъде нулевата константа, тъй като нулевата константа няма известен тип данни.
Тази грешка трябва да е доста рядка. В повечето случаи ще предавате име на колона като първи аргумент, а в SQL Server колоните имат дефиниран тип данни. В такива случаи действително ще бъде приета нулева стойност, поради факта, че SQL Server знае типа данни на колоната.
Същото може да се каже и за променливите. Ако предадете променлива, ще трябва да декларирате нейния тип и следователно няма да получите грешката.
Във всеки случай, ако получите тази грешка, можете да опитате следното решение.
Решение
Ако получите тази грешка, можете да преобразувате нулевата константа в конкретен тип данни:
SELECT NULLIF(CAST(null AS int), 7);
Резултат:
NULL
В този случай NULL
се връща, защото двата аргумента са различни и NULL
е първият аргумент.
Ако първият аргумент е колона, няма да се притеснявате за преобразуването на нейния тип, тъй като колоната вече има тип данни.
Да предположим, че имаме ProductPrice
колона:
SELECT ProductPrice
FROM Products;
Резултат:
+----------------+ | ProductPrice | |----------------| | 25.99 | | 14.75 | | 11.99 | | 0.00 | | 0.00 | | NULL | | 9.99 | | 25.99 | +----------------+
Колоната съдържа нулева стойност.
Въпреки това можем да предадем тази колона на NULLIF()
без причиняваща грешка 4151:
SELECT NULLIF(ProductPrice, 0) AS Result
FROM Products;
Резултат:
+----------+ | Result | |----------| | 25.99 | | 14.75 | | 11.99 | | NULL | | NULL | | NULL | | 9.99 | | 25.99 | +----------+
Не получихме грешка, защото SQL Server вече знае типа данни на колоната.