Ако получавате съобщение за грешка в SQL Server 8116 с текст, който гласи Дата на типа данни на аргумента е невалидна за аргумент 1 на функцията под низ , това е защото предавате грешен тип данни на функция – в този случай SUBSTRING()
функция.
Можете също да видите същата грешка (Msg 8116) в много други контексти – тя не е ограничена до SUBSTRING()
функция.
Пример за грешката
Ето пример за код, който създава грешката:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(@d, 1, 4);
Резултат:
Msg 8116, Level 16, State 1, Line 2 Argument data type date is invalid for argument 1 of substring function.
Ето, предадох date
въведете като първи аргумент за SUBSTRING()
, но това не е позволено.
SUBSTRING()
функцията приема символен, двоичен, текст, ntext или израз на изображение като свой първи аргумент. Ако предадете аргумент, който не е от тези приети типове, тогава възниква горната грешка.
Както споменахме, това може да се случи и с други функции. Така или иначе, това означава, че предавате грешен тип данни на функцията.
Решение 1
Първо, ако предавате колона, проверете дали сте получили правилната колона. Решението може да бъде просто въпрос на замяна на неправилното име на колона с правилното име на колона.
Същото, ако предавате променлива - проверете дали това е правилната променлива. Може да успеете да разрешите този проблем, като замените неправилната променлива с правилната.
Решение 2
Ако сте сигурни, че имате правилното име/променлива на колона, един от начините да коригирате тази грешка е да преобразувате аргумента в подходящия тип данни.
Например бихме могли да коригираме горния пример към следното:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(CAST(@d AS varchar(10)), 1, 4);
Резултат:
2020
Решение 3
Но преди да започнем да преобразуваме нещо, понякога си струва да се отдръпнем и да помислим дали има по-прост начин за постигане на желания резултат.
Например, в горния пример всичко, което се опитваме да направим, е да извлечем годината от датата. В този случай може би е по-добре да премахнем SUBSTRING()
функция като цяло, в полза на YEAR()
функция:
DECLARE @d date = '2020-03-04';
SELECT YEAR(@d);
Резултат:
2020
Друг начин да го направите е да използвате FORMAT()
функция:
DECLARE @d date = '2020-03-04';
SELECT FORMAT(@d, 'yyyy');
Резултат:
2020