Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Correzione del messaggio di errore 4151 "Il tipo del primo argomento in NULLIF non può essere la costante NULL perché il tipo del primo argomento deve essere noto" in SQL Server

Se ottieni il messaggio di errore 4151 "Il tipo del primo argomento in NULLIF non può essere la costante NULL perché il tipo del primo argomento deve essere noto ” in SQL Server, è perché stai passando un valore null come primo argomento a NULLIF() funzione.

Per correggere questo errore, assicurati di non passare la costante nulla come primo argomento alla funzione. Oppure, se lo fai, convertilo in un tipo di dati specifico.

Esempio di errore

Ecco un esempio di codice che produce l'errore:

SELECT NULLIF(null, 7);

Risultato:

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.

In SQL Server, il NULLIF() il valore restituito della funzione utilizza il tipo di dati della prima espressione. Ciò significa che il primo valore non deve essere la costante nulla, poiché la costante nulla non ha un tipo di dati noto.

Questo errore dovrebbe essere abbastanza raro. Nella maggior parte dei casi, passerai il nome di una colonna come primo argomento e in SQL Server le colonne hanno un tipo di dati definito. In questi casi, verrà effettivamente accettato un valore nullo, poiché SQL Server conosce il tipo di dati della colonna.

Lo stesso si può dire per le variabili. Se passi una variabile, avresti dovuto dichiararne il tipo e, quindi, non avresti ricevuto l'errore.

In ogni caso, se ricevi questo errore, puoi provare la seguente soluzione.

Soluzione

Se ricevi questo errore, puoi convertire la costante nulla in un tipo di dati specifico:

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

Risultato:

NULL

In questo caso NULL viene restituito, perché i due argomenti sono diversi e NULL è il primo argomento.

Se il primo argomento è una colonna, non dovrai preoccuparti di convertirne il tipo, perché la colonna ha già un tipo di dati.

Supponiamo di avere un ProductPrice colonna:

SELECT ProductPrice
FROM Products;

Risultato:

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

La colonna contiene un valore null.

Tuttavia, possiamo passare quella colonna a NULLIF() senza un errore che causa 4151:

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

Risultato:

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

Non abbiamo ricevuto un errore, perché SQL Server conosce già il tipo di dati della colonna.