Se ricevi un messaggio di errore SQL Server 8116 con testo che dice La data del tipo di dati dell'argomento non è valida per l'argomento 1 della funzione di sottostringa , è perché stai passando il tipo di dati sbagliato a una funzione, in questo caso, SUBSTRING()
funzione.
Potresti anche vedere lo stesso errore (Msg 8116) in molti altri contesti:non è limitato a SUBSTRING()
funzione.
Esempio di errore
Ecco un esempio di codice che produce l'errore:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(@d, 1, 4);
Risultato:
Msg 8116, Level 16, State 1, Line 2 Argument data type date is invalid for argument 1 of substring function.
Qui ho passato una date
digita come primo argomento per SUBSTRING()
, ma non è consentito.
Il SUBSTRING()
La funzione accetta un'espressione di carattere, binario, testo, ntext o immagine come primo argomento. Se passi un argomento che non è uno di quei tipi accettati, si verifica l'errore precedente.
Come accennato, può succedere anche con altre funzioni. In ogni caso, significa che stai passando il tipo di dati sbagliato alla funzione.
Soluzione 1
Innanzitutto, se stai passando una colonna, controlla di avere la colonna giusta. La soluzione potrebbe essere una semplice questione di sostituire il nome di colonna errato con il nome di colonna corretto.
Lo stesso se stai passando una variabile:controlla che sia la variabile giusta. Potresti riuscire a risolvere questo problema sostituendo la variabile errata con quella corretta.
Soluzione 2
Se sei sicuro di avere il nome di colonna/variabile corretto, un modo per correggere questo errore consiste nel convertire l'argomento nel tipo di dati appropriato.
Ad esempio, potremmo adattare l'esempio precedente a quanto segue:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(CAST(@d AS varchar(10)), 1, 4);
Risultato:
2020
Soluzione 3
Ma prima di procedere alla conversione, a volte vale la pena fare un passo indietro e pensare se esiste un modo più semplice per produrre il risultato desiderato.
Ad esempio, nell'esempio sopra, tutto ciò che stiamo cercando di fare è estrarre l'anno dalla data. In questo caso, sarebbe meglio eliminare il SUBSTRING()
funzione del tutto, a favore di YEAR()
funzione:
DECLARE @d date = '2020-03-04';
SELECT YEAR(@d);
Risultato:
2020
Un altro modo per farlo sarebbe usare FORMAT()
funzione:
DECLARE @d date = '2020-03-04';
SELECT FORMAT(@d, 'yyyy');
Risultato:
2020