Als u SQL Server-foutbericht 8116 krijgt met de tekst Argumentgegevenstype datum is ongeldig voor argument 1 van subtekenreeksfunctie , komt dat omdat u het verkeerde gegevenstype aan een functie doorgeeft - in dit geval de SUBSTRING()
functie.
U kunt dezelfde fout (bericht 8116) ook in veel andere contexten zien - het is niet beperkt tot de SUBSTRING()
functie.
Voorbeeld van de fout
Hier is een voorbeeld van code die de fout veroorzaakt:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(@d, 1, 4);
Resultaat:
Msg 8116, Level 16, State 1, Line 2 Argument data type date is invalid for argument 1 of substring function.
Hier ben ik geslaagd voor een date
typ als het eerste argument voor SUBSTRING()
, maar dit is niet toegestaan.
De SUBSTRING()
functie accepteert een teken-, binaire, tekst-, ntext- of afbeeldingsexpressie als eerste argument. Als u een argument doorgeeft dat niet een van de geaccepteerde typen is, treedt de bovenstaande fout op.
Zoals gezegd, kan het ook met andere functies gebeuren. Hoe dan ook, het betekent dat je het verkeerde gegevenstype aan de functie doorgeeft.
Oplossing 1
Controleer eerst of u de juiste kolom hebt als u een kolom passeert. De oplossing kan een kwestie zijn van het vervangen van de onjuiste kolomnaam door de juiste kolomnaam.
Hetzelfde als u een variabele doorgeeft - controleer of dit de juiste variabele is. U kunt dit probleem mogelijk oplossen door de verkeerde variabele te vervangen door de juiste.
Oplossing 2
Als u zeker weet dat u de juiste kolomnaam/variabele heeft, kunt u deze fout oplossen door het argument naar het juiste gegevenstype te converteren.
We kunnen het bovenstaande voorbeeld bijvoorbeeld aanpassen aan het volgende:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(CAST(@d AS varchar(10)), 1, 4);
Resultaat:
2020
Oplossing 3
Maar voordat we iets gaan converteren, loont het soms om een stap terug te doen en na te denken of er een eenvoudigere manier is om het gewenste resultaat te bereiken.
In het bovenstaande voorbeeld proberen we bijvoorbeeld alleen het jaar uit de datum te halen. In dit geval is het misschien beter om de SUBSTRING()
. af te schaffen functie helemaal, in het voordeel van de YEAR()
functie:
DECLARE @d date = '2020-03-04';
SELECT YEAR(@d);
Resultaat:
2020
Een andere manier om dit te doen is door de FORMAT()
. te gebruiken functie:
DECLARE @d date = '2020-03-04';
SELECT FORMAT(@d, 'yyyy');
Resultaat:
2020