Khi chuyển đổi giữa các kiểu dữ liệu trong SQL Server, bạn sẽ chạy vào các chức năng khác nhau dường như thực hiện cùng một việc. Tuy nhiên, thường có sự khác biệt giữa các chức năng này mà thoạt nhìn có thể không rõ ràng. Ví dụ về điều này là sự khác biệt giữa CAST()
và TRY_CAST()
các chức năng.
Bài viết này trình bày sự khác biệt giữa các chức năng này khi sử dụng SQL Server.
Sự khác biệt chính giữa CAST()
và TRY_CAST()
theo cách chúng xử lý dữ liệu không thể chuyển đổi.
Hàm CAST ()
CAST()
hàm chuyển đổi một biểu thức của một kiểu dữ liệu này sang một kiểu dữ liệu khác. Điều này cho phép bạn thực hiện những việc như, nối hai giá trị của các kiểu dữ liệu khác nhau. Như thế này:
SELECT 'Comments: ' + CAST(9 AS varchar(12)) AS Result;
Kết quả:
Result ----------- Comments: 9
Điều này hoạt động tốt khi dữ liệu có thể được chuyển đổi. Nhưng nếu không thể chuyển đổi dữ liệu thì sao?
Trong trường hợp đó, bạn sẽ nhận được một cái gì đó như thế này:
SELECT 'Comments: ' + CAST(10.00 AS varchar(1)) AS Result;
Kết quả:
Error: Arithmetic overflow error converting numeric to data type varchar.
Điều này đủ công bằng - nếu SQL Server không thể chuyển đổi dữ liệu, bạn cần biết!
Tuy nhiên, có một cách khác để làm điều đó.
Hàm TRY_CAST ()
TRY_CAST()
hàm hoạt động giống như CAST()
ngoại trừ trường hợp không thể chuyển đổi dữ liệu, nó sẽ trả về null
(thay vì đưa ra một lỗi như CAST()
hiện):
SELECT 'Comments: ' + TRY_CAST(10.00 AS varchar(1)) AS Result;
Kết quả:
Result ------ null
Điều này có thể hữu ích nếu bạn muốn sử dụng lập trình có điều kiện để ứng dụng thực hiện một tác vụ khác tùy thuộc vào việc dữ liệu có thể được chuyển đổi hay không.
Ví dụ:
SELECT CASE WHEN TRY_CAST(10.00 AS varchar(2)) IS NULL THEN 'Cast failed' ELSE 'Cast succeeded' END AS Result;
Kết quả:
Result ----------- Cast failed
Loại dữ liệu không hợp lệ
TRY_CAST()
hàm chỉ hoạt động theo cách này khi sử dụng các kiểu dữ liệu hợp lệ. Vì vậy, bạn sẽ gặp lỗi nếu cung cấp rõ ràng loại dữ liệu không được phép.
Ví dụ:
SELECT 'Comments: ' + TRY_CAST(10.00 AS Miami) AS Result;
Kết quả:
Error: Type Miami is not a defined system type.