SQL полнотекстовый запрос-поведение по-разному в зависимости от того, как я вызываю хранимую процедуру
Я столкнулся с запутанной проблемой.
У меня есть хранимая процедура в моей базе данных SQL Server 2008 R2, которая принимает один параметр @Query
и выполняет простой полнотекстовый поисковый запрос:
CREATE PROCEDURE dbo.SearchMyTable
@Query varchar(250)
AS
SELECT
...
FROM
...
INNER JOIN FREETEXTTABLE (t, *, @Query) ft ON ( t.Id = ft.[Key] )
ORDER BY
ft.Rank DESC
Когда я открываю окно запроса в SQL Server Management Studio и проверяю это, набрав:
SearchMyTable 'truck'
Это прекрасно работает.
Когда я набираю следующее, он все еще работает и возвращает те же результаты (предположительно игнорируя шумовое слово ' a')
SearchMyTable 'a truck'
Но тогда я принял во внимание ASP.NET страница.
private SqlDataReader DoQuery(SqlConnection connection, string query) {
SqlParameter parameter = new SqlParameter("Query", SqlDbType.VarChar);
parameter.Value = query;
SqlCommand command = connection.CreateCommand();
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "SearchMyTable";
command.Parameters.Add(parameter);
return command.ExecuteReader();
}
Когда я вызываю DoQuery(connection, "truck");
, он работает и снова получает те же результаты, которые я форматирую и распечатываю на своей странице.
Но когда я делаю вторую версию с шумовым словом, DoQuery(connection, "a truck");
, SqlDataReader возвращается пустым без строк!
Так почему же он, кажется, получает разные результаты в зависимости от того, вызываю ли я его как необработанный запрос, или через SQL Server ADO.NET провайдер в моем ASP.NET Пейдж? Я что-то упустил?
EDIT: казалось бы, в этом нет ничего плохого. Я нашел решение, которое может быть даже ошибкой в SQL/.NET. смотрите мой ответ ниже.
2 ответа:
Нашел решение.
Код, который я вам не показывал, был тем, как я читаю свои данные в моем ASP.NET Страница:
if (dr.HasRows) { ... while (dr.Read()) { ... } ... } else { // no results ... }
Оказалось, что
dr.HasRows
возвращаетсяfalse
, хотя там были строки! Такого со мной никогда не случалось за последние 10 лет. ADO.NET опыт.Поэтому я изменил его на:
if (dr.Read()) { ... do { ... } while (dr.Read()); ... } else { // no results ... }
И это работает.