Om du får SQL Server-felmeddelande 8116 med text som läser Argumentdatatypens datum är ogiltigt för argument 1 för delsträngsfunktionen , det beror på att du skickar fel datatyp till en funktion – i det här fallet, SUBSTRING()
funktion.
Du kan också se samma fel (Msg 8116) i många andra sammanhang – det är inte begränsat till SUBSTRING()
funktion.
Exempel på felet
Här är ett exempel på kod som ger felet:
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.
Här passerade jag ett date
skriv som det första argumentet till SUBSTRING()
, men detta är inte tillåtet.
SUBSTRING()
funktion accepterar ett tecken-, binär-, text-, ntext- eller bilduttryck som sitt första argument. Om du skickar ett argument som inte är en av dessa accepterade typer, uppstår ovanstående fel.
Som nämnts kan det hända med andra funktioner också. Oavsett vilket betyder det att du skickar fel datatyp till funktionen.
Lösning 1
Först, om du passerar en kolumn, kontrollera att du har rätt kolumn. Lösningen kan vara en enkel fråga att ersätta det felaktiga kolumnnamnet med det korrekta kolumnnamnet.
Samma sak om du skickar en variabel – kontrollera att det är rätt variabel. Du kanske kan lösa det här problemet genom att ersätta den felaktiga variabeln med den korrekta.
Lösning 2
Om du är säker på att du har rätt kolumnnamn/variabel är ett sätt att åtgärda detta fel att konvertera argumentet till lämplig datatyp.
Till exempel kan vi justera exemplet ovan till följande:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(CAST(@d AS varchar(10)), 1, 4);
Resultat:
2020
Lösning 3
Men innan vi konverterar något lönar det sig ibland att ta ett steg tillbaka och fundera på om det finns ett enklare sätt att få det önskade resultatet.
Till exempel, i exemplet ovan, är allt vi försöker göra att extrahera året från datumet. I det här fallet kan det vara bättre att avskaffa SUBSTRING()
funktion helt och hållet till förmån för YEAR()
funktion:
DECLARE @d date = '2020-03-04';
SELECT YEAR(@d);
Resultat:
2020
Ett annat sätt att göra det är att använda FORMAT()
funktion:
DECLARE @d date = '2020-03-04';
SELECT FORMAT(@d, 'yyyy');
Resultat:
2020