Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Поправете съобщение 8116 „Дата на типа данни на аргумента е невалидна за аргумент 1 на функцията под низ“ в SQL Server

Ако получавате съобщение за грешка в 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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Разбиране на SQL Server ALTER TABLE ADD COLUMN Инструкция

  2. Елементите ORDER BY трябва да се появят в списъка за избор, ако е посочено SELECT DISTINCT

  3. Проверете за неуспешен имейл в SQL Server (T-SQL)

  4. Стойности, разделени със запетая със SQL заявка

  5. При каскада за изтриване за таблица за саморефериране