Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Napraw komunikat 8116 „Data typu danych argumentu jest nieprawidłowa dla argumentu 1 funkcji podciągu” w SQL Server

Jeśli otrzymujesz komunikat o błędzie SQL Server 8116 z tekstem o treści Data typu danych argumentu jest nieprawidłowa dla argumentu 1 funkcji podciągu , dzieje się tak, ponieważ przekazujesz niewłaściwy typ danych do funkcji – w tym przypadku SUBSTRING() funkcja.

Możesz również zobaczyć ten sam błąd (Msg 8116) w wielu innych kontekstach – nie ogranicza się on do SUBSTRING() funkcja.

Przykład błędu

Oto przykład kodu, który generuje błąd:

DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(@d, 1, 4);

Wynik:

Msg 8116, Level 16, State 1, Line 2
Argument data type date is invalid for argument 1 of substring function.

Tutaj zdałem date wpisz jako pierwszy argument SUBSTRING() , ale nie jest to dozwolone.

SUBSTRING() funkcja akceptuje wyrażenie znakowe, binarne, tekstowe, ntext lub graficzne jako pierwszy argument. Jeśli przekażesz argument, który nie jest jednym z tych akceptowanych typów, wystąpi powyższy błąd.

Jak wspomniano, może się to zdarzyć również w przypadku innych funkcji. Tak czy inaczej, oznacza to, że przekazujesz do funkcji niewłaściwy typ danych.

Rozwiązanie 1

Po pierwsze, jeśli przekazujesz kolumnę, sprawdź, czy masz właściwą kolumnę. Rozwiązaniem może być prosta sprawa zastąpienia nieprawidłowej nazwy kolumny prawidłową nazwą kolumny.

To samo, jeśli przekazujesz zmienną – sprawdź, czy jest to właściwa zmienna. Możesz rozwiązać ten problem, zastępując nieprawidłową zmienną prawidłową.

Rozwiązanie 2

Jeśli masz pewność, że masz poprawną nazwę/zmienną kolumny, jednym ze sposobów naprawienia tego błędu jest przekonwertowanie argumentu na odpowiedni typ danych.

Na przykład możemy dostosować powyższy przykład do następującego:

DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(CAST(@d AS varchar(10)), 1, 4);

Wynik:

2020

Rozwiązanie 3

Ale zanim zaczniemy cokolwiek konwertować, czasami opłaca się cofnąć i zastanowić, czy istnieje prostszy sposób na uzyskanie pożądanego rezultatu.

Na przykład w powyższym przykładzie wszystko, co próbujemy zrobić, to wyodrębnić rok od daty. W takim przypadku może lepiej zrezygnować z SUBSTRING() funkcja w całości, na korzyść YEAR() funkcja:

DECLARE @d date = '2020-03-04';
SELECT YEAR(@d);

Wynik:

2020

Innym sposobem na to byłoby użycie FORMAT() funkcja:

DECLARE @d date = '2020-03-04';
SELECT FORMAT(@d, 'yyyy');

Wynik:

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. Jak używać zmiennej tabeli w dynamicznej instrukcji sql?

  2. Transpozycja wierszy i kolumn bez agregatu

  3. Wybierz oświadczenie, aby znaleźć duplikaty w określonych polach

  4. Rozwiązywanie problemów z replikacją transakcyjną programu SQL Server

  5. Używana wersja SQL Server nie obsługuje danych typu datetime2?