Kiểm tra loại tham số (@SSN) bạn chuyển cho SQL. Thông số thường xuyên được thêm vào như thế này:
List<...> GetBySSN(string ssn) {
SqlCommand cmd = new SqlCommand (@"select ... from ... where [email protected]", conn);
cmd.Parameters.AddWithValue("@SSN", ssn);
using (SqlDataReader rdr = cmd.ExecuteQuery()) {
...
}
}
Rất tiếc, mẫu này thêm @SSN
tham số dưới dạng NVARCHAR
loại (tức là. Unicode). Các quy tắc của SQL Server Thứ tự loại dữ liệu
yêu cầu so sánh giữa NVARCHAR và VARCHAR được thực hiện dưới dạng NVARCHAR, do đó, truy vấn được thực hiện như thể SQL sau được yêu cầu:
select ... from ... where CAST(SSN as NVARCHAR) = @SSN;
Truy vấn này không thể được hưởng lợi từ một chỉ mục trên cột SSN, vì vậy thay vào đó, quá trình quét bảng được thực hiện. 90% số lần tôi điều tra xác nhận quyền sở hữu 'truy vấn chạy chậm từ ứng dụng nhưng nhanh từ SSMS' là vấn đề này, bởi vì phần lớn các nhà phát triển thực sự chạy một khác truy vấn trong SSMS để so sánh với (chúng sử dụng đối số VARCHAR hoặc giá trị được mã hóa cứng).
Nếu đây thực sự là vấn đề, thì giải pháp là nhỏ:chỉ định rõ ràng loại tham số là SqlDbType.VarChar
.