Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Correction de Msg 8116 "La date du type de données d'argument n'est pas valide pour l'argument 1 de la fonction de sous-chaîne" dans SQL Server

Si vous obtenez l'erreur SQL Server Msg 8116 avec un texte indiquant La date du type de données d'argument n'est pas valide pour l'argument 1 de la fonction de sous-chaîne , c'est parce que vous transmettez le mauvais type de données à une fonction - dans ce cas, le SUBSTRING() fonction.

Vous pouvez également voir la même erreur (Msg 8116) dans de nombreux autres contextes - elle n'est pas limitée au SUBSTRING() fonction.

Exemple d'erreur

Voici un exemple de code qui génère l'erreur :

DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(@d, 1, 4);

Résultat :

Msg 8116, Level 16, State 1, Line 2
Argument data type date is invalid for argument 1 of substring function.

Ici, j'ai passé une date tapez comme premier argument de SUBSTRING() , mais ce n'est pas autorisé.

Le SUBSTRING() La fonction accepte une expression de type caractère, binaire, texte, ntext ou image comme premier argument. Si vous passez un argument qui ne fait pas partie de ces types acceptés, l'erreur ci-dessus se produit.

Comme mentionné, cela peut également arriver avec d'autres fonctions. Dans tous les cas, cela signifie que vous transmettez le mauvais type de données à la fonction.

Solution 1

Tout d'abord, si vous passez une colonne, vérifiez que vous avez la bonne colonne. La solution pourrait consister simplement à remplacer le nom de colonne incorrect par le nom de colonne correct.

Idem si vous passez une variable - vérifiez que c'est la bonne variable. Vous pourrez peut-être résoudre ce problème en remplaçant la variable incorrecte par la bonne.

Solution 2

Si vous êtes sûr d'avoir le bon nom de colonne/variable, une façon de corriger cette erreur consiste à convertir l'argument dans le type de données approprié.

Par exemple, nous pourrions ajuster l'exemple ci-dessus comme suit :

DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(CAST(@d AS varchar(10)), 1, 4);

Résultat :

2020

Solution 3

Mais avant de convertir quoi que ce soit, il est parfois utile de prendre du recul et de réfléchir s'il existe un moyen plus simple d'obtenir le résultat souhaité.

Par exemple, dans l'exemple ci-dessus, tout ce que nous essayons de faire est d'extraire l'année de la date. Dans ce cas, nous ferions peut-être mieux de supprimer le SUBSTRING() fonction tout à fait, en faveur de la YEAR() fonction :

DECLARE @d date = '2020-03-04';
SELECT YEAR(@d);

Résultat :

2020

Une autre façon de le faire serait d'utiliser le FORMAT() fonction :

DECLARE @d date = '2020-03-04';
SELECT FORMAT(@d, 'yyyy');

Résultat :

2020