Theo tài liệu của Microsoft , cho chức năng:
ISNULL(check_expression, replacement_value)
replacement_value
phải thuộc loại có thể chuyển đổi hoàn toàn thành loại check_expression
. Lưu ý rằng loại cho 'xy'+NULL
là VARCHAR(3)
. Do đó, chuỗi của bạn 'ABCDEFGHIJ'
được truyền tới VARCHAR(3)
và do đó được cắt bớt.
Nghe có vẻ lạ tại sao nó không phải là VARCHAR(2)
, nhưng đây là cách - một ký tự dài hơn 'xy'
. Bạn có thể chơi với SQLFiddle
này và tự xem loại cho 'xy'+NULL
giống như đối với biểu thức CASE WHEN 1=2 THEN 'XYZ' ELSE NULL END
, là NULL
nhưng hoàn toàn tương thích với VARCHAR(3)
.
Có vẻ như đối với biểu thức 'xy'+NULL
chiều dài cảm nhận có thể được tính là 'xy'
độ dài chuỗi (2) cộng với 1 cho mọi NULL
thêm. Ví dụ:loại 'xy'+NULL+NULL
là VARCHAR(4)
, nhập cho 'xy'+NULL+NULL+NULL
là VARCHAR(5)
v.v. - hãy xem SQLFiddle
này . Điều này cực kỳ kỳ lạ, nhưng đó là cách MS SQL Server 2008 và 2012 hoạt động.