Jeśli pojawi się błąd Msg 4151 „Typ pierwszego argumentu funkcji NULLIF nie może być stałą NULL, ponieważ typ pierwszego argumentu musi być znany ” w SQL Server, dzieje się tak, ponieważ przekazujesz wartość null jako pierwszy argument do NULLIF()
funkcja.
Aby naprawić ten błąd, upewnij się, że nie przekazujesz stałej null jako pierwszego argumentu funkcji. A jeśli tak, przekonwertuj go na określony typ danych.
Przykład błędu
Oto przykład kodu, który generuje błąd:
SELECT NULLIF(null, 7);
Wynik:
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.
W SQL Server NULLIF()
wartość zwracana przez funkcję wykorzystuje typ danych pierwszego wyrażenia. Oznacza to, że pierwsza wartość nie może być stałą pustą, ponieważ stała pusta nie ma znanego typu danych.
Ten błąd powinien być dość rzadki. W większości przypadków jako pierwszy argument przekażesz nazwę kolumny, a w SQL Server kolumny mają zdefiniowany typ danych. W takich przypadkach wartość null będzie faktycznie akceptowana, ponieważ SQL Server zna typ danych kolumny.
To samo można powiedzieć o zmiennych. Jeśli przekażesz zmienną, będziesz musiał zadeklarować jej typ, a zatem nie otrzymasz błędu.
W każdym razie, jeśli pojawi się ten błąd, możesz wypróbować następujące rozwiązanie.
Rozwiązanie
Jeśli pojawi się ten błąd, możesz przekonwertować stałą pustą na określony typ danych:
SELECT NULLIF(CAST(null AS int), 7);
Wynik:
NULL
W tym przypadku NULL
jest zwracany, ponieważ oba argumenty są różne i NULL
jest pierwszym argumentem.
Jeśli pierwszym argumentem jest kolumna, nie musisz się martwić o konwersję jej typu, ponieważ kolumna ma już typ danych.
Załóżmy, że mamy ProductPrice
kolumna:
SELECT ProductPrice
FROM Products;
Wynik:
+----------------+ | ProductPrice | |----------------| | 25.99 | | 14.75 | | 11.99 | | 0.00 | | 0.00 | | NULL | | 9.99 | | 25.99 | +----------------+
Kolumna zawiera wartość null.
Możemy jednak przekazać tę kolumnę do NULLIF()
bez powodu błędu 4151:
SELECT NULLIF(ProductPrice, 0) AS Result
FROM Products;
Wynik:
+----------+ | Result | |----------| | 25.99 | | 14.75 | | 11.99 | | NULL | | NULL | | NULL | | 9.99 | | 25.99 | +----------+
Nie otrzymaliśmy błędu, ponieważ SQL Server zna już typ danych kolumny.