Hvis du får SQL Server-fejlmeddelelse 8116 med tekst, der lyder Argumentdatatypedatoen er ugyldig for argument 1 i understrengsfunktionen , det er fordi du sender den forkerte datatype til en funktion – i dette tilfælde SUBSTRING()
funktion.
Du kan også se den samme fejl (Msg 8116) i mange andre sammenhænge – den er ikke begrænset til SUBSTRING()
funktion.
Eksempel på fejlen
Her er et eksempel på kode, der producerer fejlen:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(@d, 1, 4);
Resultat:
Msg 8116, Level 16, State 1, Line 2 Argument data type date is invalid for argument 1 of substring function.
Her passerede jeg en date
skriv som det første argument til SUBSTRING()
, men dette er ikke tilladt.
SUBSTRING()
funktion accepterer et tegn, binært, tekst-, ntekst- eller billedudtryk som dets første argument. Hvis du sender et argument, der ikke er en af disse accepterede typer, opstår ovenstående fejl.
Som nævnt kan det også ske med andre funktioner. Uanset hvad, betyder det, at du sender den forkerte datatype til funktionen.
Løsning 1
Først, hvis du sender en kolonne, skal du kontrollere, at du har den rigtige kolonne. Løsningen kunne være et simpelt spørgsmål om at erstatte det forkerte kolonnenavn med det korrekte kolonnenavn.
Det samme hvis du sender en variabel - tjek at det er den rigtige variabel. Du kan muligvis løse dette problem ved at erstatte den forkerte variabel med den rigtige.
Løsning 2
Hvis du er sikker på, at du har det korrekte kolonnenavn/variabel, er en måde at rette denne fejl på ved at konvertere argumentet til den relevante datatype.
For eksempel kunne vi justere ovenstående eksempel til følgende:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(CAST(@d AS varchar(10)), 1, 4);
Resultat:
2020
Løsning 3
Men før vi går i gang med at konvertere noget, kan det nogle gange betale sig at træde tilbage og tænke på, om der er en enklere måde at opnå det ønskede resultat på.
For eksempel, i ovenstående eksempel, er alt, hvad vi forsøger at gøre, at udtrække året fra datoen. I dette tilfælde er det måske bedre, at vi afskaffer SUBSTRING()
fungerer helt til fordel for YEAR()
funktion:
DECLARE @d date = '2020-03-04';
SELECT YEAR(@d);
Resultat:
2020
En anden måde at gøre det på ville være at bruge FORMAT()
funktion:
DECLARE @d date = '2020-03-04';
SELECT FORMAT(@d, 'yyyy');
Resultat:
2020