2013-09-19 61 views

Trả lời

11

Theo Microsoft documentation, cho chức năng:

ISNULL(check_expression, replacement_value) 

replacement_value phải có một loại đó là mặc nhiên chuyển đổi thành các loại check_expression. Lưu ý rằng loại cho 'xy'+NULLVARCHAR(3). Bởi vì chuỗi này 'ABCDEFGHIJ' của bạn được đúc thành VARCHAR(3) và do đó được cắt.

Có vẻ lạ tại sao nó không phải là VARCHAR(2), nhưng đây là cách nó - một ký tự dài hơn 'xy'. Bạn có thể chơi với điều này SQLFiddle và xem cho chính mình rằng loại cho 'xy'+NULL là 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).

Dường như đối với biểu thức 'xy'+NULL độ dài nhận biết có thể được tính là 'xy' chiều dài chuỗi (2) cộng 1 cho mỗi NULL được thêm vào. Ví dụ: loại 'xy'+NULL+NULLVARCHAR(4), nhập cho 'xy'+NULL+NULL+NULLVARCHAR(5) v.v. - hãy xem SQLFiddle này. Điều này là cực kỳ kỳ lạ, nhưng đó là cách MS SQL Server 2008 và 2012 hoạt động.

+0

Giải thích tốt, mặc dù tôi không thuyết phục về varchar (3) thay vì varchar (2) - Tôi không thể tìm thấy nó tài liệu bất cứ nơi nào. – natenho

+0

Chứng minh rằng đó là VARCHAR (3): http://sqlfiddle.com/#!3/d41d8/20987 – mvp

+1

Tôi phải tăng thông tin ở đây để giải thích thêm về hành vi COALESCE trong hành vi ISNULL, từ Microsoft [tài liệu] (http://technet.microsoft.com/en-us/library/ms190349.aspx): Biểu thức COALESCE là một cú pháp cú pháp cho biểu thức CASE. Tức là, mã COALESCE (expression1, ... n) được viết lại bởi trình tối ưu hóa truy vấn như biểu thức CASE sau đây: CASE WHEN (expression1 IS NOT NULL) THEN expression1 WHEN (expression2 IS NOT NULL) THEN expression2 ... Biểu thức ELSEN END -> Loại trả về trường hợp được cho bởi độ ưu tiên cao nhất expr. – natenho

1

ISNULL() chuyển giá trị thay thế thành loại biểu thức kiểm tra. Trong trường hợp này, loại biểu thức kiểm tra là CHAR(2), do đó, chuyển đổi giá trị thay thế sẽ cắt bớt nó (bạn có chắc là bạn đang nhận được ABC và không chỉ AB?).

Từ Microsoft documentation:

replacement_value có thể được rút ngắn nếu replacement_value dài hơn check_expression.

+1

"ABC" cho chắc chắn. – natenho

Các vấn đề liên quan