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