Để thú vị hơn nữa, hãy thử cái này:
DECLARE @i INT
SET @i = 100
SELECT CAST(@i AS VARCHAR(2)) -- result: '*'
go
DECLARE @i INT
SET @i = 100
SELECT CAST(@i AS NVARCHAR(2)) -- result: Arithmetic overflow error
:)
Câu trả lời cho truy vấn của bạn là:"Lý do lịch sử"
Các kiểu dữ liệu INT và VARCHAR cũ hơn BIGINT và NVARCHAR. Nhiều lớn hơn. Trên thực tế, chúng ở bản gốc Thông số kỹ thuật SQL. Ngoài ra, cách tiếp cận loại bỏ ngoại lệ cũng cũ hơn là thay thế đầu ra bằng dấu hoa thị.
Sau đó, những người sử dụng SQL quyết định rằng việc ném ra một lỗi sẽ tốt hơn / nhất quán hơn, v.v. so với việc thay thế các chuỗi đầu ra không có thật (và thường gây nhầm lẫn). Tuy nhiên, vì lợi ích nhất quán, họ đã giữ lại hành vi trước đó cho các kết hợp loại dữ liệu đã có từ trước (để không phá vỡ mã hiện có).
Vì vậy, (nhiều) sau này khi các kiểu dữ liệu BIGINT và NVARCHAR được thêm vào, chúng có hành vi (er) mới vì chúng không được bao phủ bởi grandfathering được đề cập ở trên.