Periksa jenis parameter (@SSN) yang Anda berikan ke SQL. Lebih sering daripada tidak, parameter ditambahkan seperti ini:
List<...> GetBySSN(string ssn) {
SqlCommand cmd = new SqlCommand (@"select ... from ... where [email protected]", conn);
cmd.Parameters.AddWithValue("@SSN", ssn);
using (SqlDataReader rdr = cmd.ExecuteQuery()) {
...
}
}
Sayangnya pola ini menambahkan @SSN
parameter sebagai NVARCHAR
ketik (mis. Unicode). Aturan SQL Server Prioritas Jenis Data
memerlukan perbandingan antara NVARCHAR dan VARCHAR untuk dilakukan sebagai NVARCHAR, sehingga kueri dijalankan seolah-olah SQL berikut diminta:
select ... from ... where CAST(SSN as NVARCHAR) = @SSN;
Kueri ini tidak dapat mengambil manfaat dari indeks pada kolom SSN sehingga pemindaian tabel dilakukan sebagai gantinya. 90% dari waktu saya menyelidiki klaim 'kueri berjalan lambat dari aplikasi tetapi cepat dari SSMS' adalah masalah ini, karena sebagian besar pengembang sebenarnya menjalankan berbeda kueri di SSMS untuk dibandingkan (mereka menggunakan argumen VARCHAR atau nilai kode keras).
Jika memang ini masalahnya, solusinya sepele:tentukan jenis parameter secara eksplisit sebagai SqlDbType.VarChar
.