Điều này hoàn toàn có thể dự đoán và được mong đợi vì Ưu tiên kiểu dữ liệu
Đối với điều này, cột giao diện người dùng sẽ được thay đổi thành số thập phân (25,0)
where UI = 2011040773395012950010370
Điều này gần như chính xác. Phía bên tay phải là varchar và được đổi thành nvarchar
where UI = '2011040773395012950010370'
Đây là thực sự đúng phiên bản trong đó cả hai loại đều giống nhau
where UI = N'2011040773395012950010370'
Lỗi sẽ bắt đầu xảy ra vì cột giao diện người dùng hiện chứa giá trị không CAST thành số thập phân (25,0).
Một số lưu ý không liên quan:
- nếu bạn có một chỉ mục trên cột Giao diện người dùng, nó sẽ bị bỏ qua trong phiên bản đầu tiên vì yêu cầu CAST ngầm định
- bạn có cần unicode để lưu trữ các chữ số không? Có một chi phí nghiêm trọng với các loại dữ liệu unicode trong lưu trữ và hiệu suất
- tại sao không sử dụng
char(25)
hoặcnchar(25)
là giá trị luôn luôn cố định độ dài? Các truy vấn của bạn sử dụng quá nhiều bộ nhớ như một người tối ưu hóa giả định độ dài trung bình là 128 ký tự dựa trênnvarchar(256)
Chỉnh sửa, sau khi nhận xét
Đừng cho rằng "tại sao đôi khi nó hoạt động" khi bạn không biết rằng nó hoạt động
Ví dụ:
- Giá trị có thể đã bị xóa sau đó được thêm vào sau
- Mệnh đề ĐẦU hoặc TÀI KHOẢN ĐẶT có thể có nghĩa là không đạt được giá trị vi phạm
- Truy vấn không bao giờ được chạy nên không thể thất bại
- Một số mã khác vẫn bỏ qua lỗi?
Chỉnh sửa 2 để hy vọng rõ ràng hơn
Trò chuyện
gbn:
Ngẫu nhiên:
gbn
Như Tao đã đề cập , điều quan trọng là phải hiểu rằng một truy vấn khác không liên quan có thể phá vỡ truy vấn ngay cả khi truy vấn này ổn.