Nếu bạn gặp lỗi SQL Server Msg 8116 với văn bản có nội dung Ngày kiểu dữ liệu đối số không hợp lệ cho đối số 1 của hàm chuỗi con , đó là do bạn đang chuyển sai loại dữ liệu cho một hàm - trong trường hợp này là SUBSTRING()
chức năng.
Bạn cũng có thể gặp lỗi tương tự (Msg 8116) trong nhiều ngữ cảnh khác - nó không giới hạn ở SUBSTRING()
chức năng.
Ví dụ về lỗi
Dưới đây là một ví dụ về mã tạo ra lỗi:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(@d, 1, 4);
Kết quả:
Msg 8116, Level 16, State 1, Line 2 Argument data type date is invalid for argument 1 of substring function.
Ở đây, tôi đã vượt qua một date
nhập làm đối số đầu tiên vào SUBSTRING()
, nhưng điều này không được phép.
SUBSTRING()
hàm chấp nhận một biểu thức ký tự, nhị phân, văn bản, ntext hoặc hình ảnh làm đối số đầu tiên của nó. Nếu bạn chuyển đối số không phải là một trong những loại được chấp nhận đó, thì lỗi ở trên sẽ xảy ra.
Như đã đề cập, nó cũng có thể xảy ra với các chức năng khác. Dù bằng cách nào, điều đó có nghĩa là bạn đang chuyển sai loại dữ liệu cho hàm.
Giải pháp 1
Trước tiên, nếu bạn đang chuyển một cột, hãy kiểm tra xem bạn đã chọn đúng cột chưa. Giải pháp có thể là một vấn đề đơn giản là thay thế tên cột không chính xác bằng tên cột chính xác.
Tương tự nếu bạn đang chuyển một biến - hãy kiểm tra xem đó có phải là biến phù hợp hay không. Bạn có thể giải quyết vấn đề này bằng cách thay thế biến không chính xác bằng biến đúng.
Giải pháp 2
Nếu bạn chắc chắn rằng bạn đã có tên / biến cột chính xác, một cách để khắc phục lỗi này là chuyển đổi đối số thành loại dữ liệu thích hợp.
Ví dụ:chúng ta có thể điều chỉnh ví dụ trên thành như sau:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(CAST(@d AS varchar(10)), 1, 4);
Kết quả:
2020
Giải pháp 3
Nhưng trước khi chúng ta chuyển đổi bất cứ điều gì, đôi khi chúng ta phải lùi lại và suy nghĩ xem có cách nào đơn giản hơn để tạo ra kết quả mong muốn không.
Ví dụ:trong ví dụ trên, tất cả những gì chúng tôi đang cố gắng làm là trích xuất năm từ ngày. Trong trường hợp này, tốt hơn chúng ta nên loại bỏ SUBSTRING()
hoạt động hoàn toàn, có lợi cho YEAR()
chức năng:
DECLARE @d date = '2020-03-04';
SELECT YEAR(@d);
Kết quả:
2020
Một cách khác để làm điều đó là sử dụng FORMAT()
chức năng:
DECLARE @d date = '2020-03-04';
SELECT FORMAT(@d, 'yyyy');
Kết quả:
2020