Проверете типа на параметъра (@SSN), който предавате на SQL. По-често параметърът се добавя по следния начин:
List<...> GetBySSN(string ssn) {
SqlCommand cmd = new SqlCommand (@"select ... from ... where [email protected]", conn);
cmd.Parameters.AddWithValue("@SSN", ssn);
using (SqlDataReader rdr = cmd.ExecuteQuery()) {
...
}
}
Този модел за съжаление добавя @SSN
параметър като NVARCHAR
тип (т.е. Unicode). Правилата на SQL Server Приоритет на типа данни
изискват сравнението между NVARCHAR и VARCHAR да се извършва като NVARCHAR, така че заявката се изпълнява така, сякаш е бил поискан следният SQL:
select ... from ... where CAST(SSN as NVARCHAR) = @SSN;
Тази заявка не може да се възползва от индекс в колоната SSN, така че вместо това се извършва сканиране на таблица. 90% от случаите, когато проучвам твърдението „заявката се изпълнява бавно от приложението, но бързо от SSMS“ е този проблем, защото огромното мнозинство от разработчиците всъщност изпълняват различни заявка в SSMS за сравняване (те използват аргумент VARCHAR или твърдо кодирана стойност).
Ако това наистина е проблемът, решението е тривиално:изрично посочете типа на параметъра като SqlDbType.VarChar
.