sql >> Databasteknik >  >> RDS >> Sqlserver

Fix Error Msg 4151 "Typen av det första argumentet till NULLIF kan inte vara NULL-konstanten eftersom typen av det första argumentet måste vara känd" i SQL Server

Om du får felmeddelandet Msg 4151 "Typen av det första argumentet till NULLIF kan inte vara NULL-konstanten eftersom typen av det första argumentet måste vara känd ” i SQL Server beror det på att du skickar ett nullvärde som det första argumentet till NULLIF() funktion.

För att åtgärda detta fel, se till att du inte skickar null-konstanten som det första argumentet till funktionen. Eller om du gör det, konvertera den sedan till en specifik datatyp.

Exempel på felet

Här är ett exempel på kod som ger felet:

SELECT NULLIF(null, 7);

Resultat:

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.

I SQL Server, NULLIF() funktions returvärde använder datatypen för det första uttrycket. Det betyder att det första värdet inte får vara nollkonstanten, eftersom nollkonstanten inte har någon känd datatyp.

Detta fel bör vara ganska sällsynt. I de flesta fall skickar du ett kolumnnamn som det första argumentet, och i SQL Server har kolumner en definierad datatyp. I sådana fall kommer ett null-värde faktiskt att accepteras, på grund av att SQL Server känner till kolumnens datatyp.

Detsamma kan sägas om variabler. Om du skickar en variabel, skulle du ha behövt deklarera dess typ, och därför skulle du inte få felet.

I alla fall, om du får det här felet, kan du prova följande lösning.

Lösning

Om du får det här felet kan du konvertera nollkonstanten till en specifik datatyp:

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

Resultat:

NULL

I det här fallet NULL returneras, eftersom de två argumenten är olika och NULL är det första argumentet.

Om det första argumentet är en kolumn behöver du inte oroa dig för att konvertera dess typ, eftersom kolumnen redan har en datatyp.

Anta att vi har ett ProductPrice kolumn:

SELECT ProductPrice
FROM Products;

Resultat:

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

Kolumnen innehåller ett nollvärde.

Vi kan dock skicka den kolumnen till NULLIF() utan att orsaka fel 4151:

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

Resultat:

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

Vi fick inget fel, eftersom SQL Server redan känner till datatypen för kolumnen.


  1. importera redan skapad SQLite-databas (xamarin)

  2. LOG() Funktion i Oracle

  3. Hur man listar alla standardbegränsningar med kolumner i SQL Server-databasen - SQL Server / TSQL självstudie del 92

  4. Hur man installerar MySQL på Windows