Pokud se vám zobrazuje chyba SQL Server Msg 8116 s textem, který zní Datum datového typu argumentu je neplatné pro argument 1 funkce podřetězec , je to proto, že do funkce předáváte nesprávný datový typ – v tomto případě SUBSTRING()
funkce.
Stejnou chybu (Msg 8116) můžete vidět také v mnoha jiných kontextech – není omezena na SUBSTRING()
funkce.
Příklad chyby
Zde je příklad kódu, který způsobuje chybu:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(@d, 1, 4);
Výsledek:
Msg 8116, Level 16, State 1, Line 2 Argument data type date is invalid for argument 1 of substring function.
Zde jsem předal date
zadejte jako první argument do SUBSTRING()
, ale to není povoleno.
SUBSTRING()
Funkce přijímá znakový, binární, textový, ntextový nebo obrázkový výraz jako svůj první argument. Pokud předáte argument, který není jedním z těchto akceptovaných typů, dojde k výše uvedené chybě.
Jak již bylo zmíněno, může se to stát i u jiných funkcí. V každém případě to znamená, že funkci předáváte nesprávný datový typ.
Řešení 1
Za prvé, pokud procházíte kolonou, zkontrolujte, zda máte správný sloupec. Řešením může být jednoduchá záležitost nahrazení nesprávného názvu sloupce správným názvem sloupce.
Totéž, pokud předáváte proměnnou – zkontrolujte, zda se jedná o správnou proměnnou. Tento problém můžete vyřešit nahrazením nesprávné proměnné správnou.
Řešení 2
Pokud jste si jisti, že máte správný název sloupce/proměnnou, jedním ze způsobů, jak tuto chybu opravit, je převést argument na příslušný datový typ.
Výše uvedený příklad bychom mohli upravit například na následující:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(CAST(@d AS varchar(10)), 1, 4);
Výsledek:
2020
Řešení 3
Ale než něco převedeme, někdy se vyplatí ustoupit a přemýšlet, jestli neexistuje jednodušší způsob, jak dosáhnout požadovaného výsledku.
Například ve výše uvedeném příkladu se vše, co se snažíme udělat, je extrahovat rok z data. V tomto případě by bylo lepší odstranit SUBSTRING()
funkce jako celek ve prospěch YEAR()
funkce:
DECLARE @d date = '2020-03-04';
SELECT YEAR(@d);
Výsledek:
2020
Dalším způsobem, jak to udělat, by bylo použít FORMAT()
funkce:
DECLARE @d date = '2020-03-04';
SELECT FORMAT(@d, 'yyyy');
Výsledek:
2020