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

Correction du message d'erreur 4151 "Le type du premier argument de NULLIF ne peut pas être la constante NULL car le type du premier argument doit être connu" dans SQL Server

Si vous obtenez l'erreur Msg 4151 "Le type du premier argument de NULLIF ne peut pas être la constante NULL car le type du premier argument doit être connu " dans SQL Server, c'est parce que vous transmettez une valeur nulle comme premier argument au NULLIF() fonction.

Pour corriger cette erreur, assurez-vous de ne pas transmettre la constante nulle comme premier argument à la fonction. Ou si vous le faites, convertissez-le en un type de données spécifique.

Exemple d'erreur

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

SELECT NULLIF(null, 7);

Résultat :

Msg 4151, Level 16, State 1, Line 1
The type of the first argument to NULLIF cannot be the NULL constant because the type of the first argument has to be known.

Dans SQL Server, le NULLIF() La valeur de retour de la fonction utilise le type de données de la première expression. Cela signifie que la première valeur ne doit pas être la constante nulle, car la constante nulle n'a pas de type de données connu.

Cette erreur devrait être assez rare. Dans la plupart des cas, vous passerez un nom de colonne comme premier argument, et dans SQL Server, les colonnes ont un type de données défini. Dans de tels cas, une valeur nulle sera en fait acceptée, car SQL Server connaît le type de données de la colonne.

On pourrait dire la même chose pour les variables. Si vous passiez une variable, vous auriez dû déclarer son type, et donc, vous n'obtiendriez pas l'erreur.

Dans tous les cas, si vous obtenez cette erreur, vous pouvez essayer la solution suivante.

Solution

Si vous obtenez cette erreur, vous pouvez convertir la constante nulle en un type de données spécifique :

SELECT NULLIF(CAST(null AS int), 7);

Résultat :

NULL

Dans ce cas NULL est retourné, car les deux arguments sont différents et NULL est le premier argument.

Si le premier argument est une colonne, vous n'aurez pas à vous soucier de la conversion de son type, car la colonne a déjà un type de données.

Supposons que nous ayons un ProductPrice colonne :

SELECT ProductPrice
FROM Products;

Résultat :

+----------------+
| ProductPrice   |
|----------------|
| 25.99          |
| 14.75          |
| 11.99          |
| 0.00           |
| 0.00           |
| NULL           |
| 9.99           |
| 25.99          |
+----------------+

La colonne contient une valeur nulle.

Cependant, nous pouvons passer cette colonne à NULLIF() sans provoquer l'erreur 4151 :

SELECT NULLIF(ProductPrice, 0) AS Result
FROM Products;

Résultat :

+----------+
| Result   |
|----------|
| 25.99    |
| 14.75    |
| 11.99    |
| NULL     |
| NULL     |
| NULL     |
| 9.99     |
| 25.99    |
+----------+

Nous n'avons pas reçu d'erreur, car SQL Server connaît déjà le type de données de la colonne.