Nếu bạn gặp lỗi Msg 4151 “ Kiểu của đối số đầu tiên đối với NULLIF không thể là hằng số NULL vì kiểu của đối số đầu tiên phải được biết ”Trong SQL Server, đó là vì bạn đang chuyển một giá trị null làm đối số đầu tiên cho NULLIF()
chức năng.
Để khắc phục lỗi này, hãy đảm bảo rằng bạn không chuyển hằng số null làm đối số đầu tiên cho hàm. Hoặc nếu bạn làm vậy, hãy chuyển đổi nó thành một kiểu dữ liệu cụ thể.
Ví dụ về lỗi
Dưới đây là một ví dụ về mã tạo ra lỗi:
SELECT NULLIF(null, 7);
Kết quả:
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.
Trong SQL Server, NULLIF()
giá trị trả về của hàm sử dụng kiểu dữ liệu của biểu thức đầu tiên. Điều này có nghĩa là giá trị đầu tiên không được là hằng số null, vì hằng số null không có kiểu dữ liệu đã biết.
Lỗi này nên khá hiếm. Trong hầu hết các trường hợp, bạn sẽ chuyển tên cột làm đối số đầu tiên và trong SQL Server, các cột có kiểu dữ liệu xác định. Trong những trường hợp như vậy, giá trị null sẽ thực sự được chấp nhận do SQL Server biết kiểu dữ liệu của cột.
Điều tương tự cũng có thể được nói đối với các biến. Nếu bạn truyền một biến, bạn sẽ phải khai báo kiểu của nó và do đó, bạn sẽ không gặp lỗi.
Trong mọi trường hợp, nếu bạn gặp lỗi này, bạn có thể thử giải pháp sau.
Giải pháp
Nếu bạn gặp phải lỗi này, bạn có thể chuyển đổi hằng số null thành một kiểu dữ liệu cụ thể:
SELECT NULLIF(CAST(null AS int), 7);
Kết quả:
NULL
Trong trường hợp này NULL
được trả về, vì hai đối số khác nhau và NULL
là đối số đầu tiên.
Nếu đối số đầu tiên là một cột, bạn sẽ không cần phải lo lắng về việc chuyển đổi kiểu của nó, vì cột đã có một kiểu dữ liệu.
Giả sử chúng ta có ProductPrice
cột:
SELECT ProductPrice
FROM Products;
Kết quả:
+----------------+ | ProductPrice | |----------------| | 25.99 | | 14.75 | | 11.99 | | 0.00 | | 0.00 | | NULL | | 9.99 | | 25.99 | +----------------+
Cột chứa giá trị null.
Tuy nhiên, chúng ta có thể chuyển cột đó sang NULLIF()
không có lỗi gây ra 4151:
SELECT NULLIF(ProductPrice, 0) AS Result
FROM Products;
Kết quả:
+----------+ | Result | |----------| | 25.99 | | 14.75 | | 11.99 | | NULL | | NULL | | NULL | | 9.99 | | 25.99 | +----------+
Chúng tôi không gặp lỗi vì SQL Server đã biết kiểu dữ liệu của cột.