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 Management Studio.

Так почему же он, кажется, получает разные результаты в зависимости от того, вызываю ли я его как необработанный запрос, или через SQL Server ADO.NET провайдер в моем ASP.NET Пейдж? Я что-то упустил?

EDIT: казалось бы, в этом нет ничего плохого. Я нашел решение, которое может быть даже ошибкой в SQL/.NET. смотрите мой ответ ниже.

2 2

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
    ...
}

И это работает.

Попробуйте запустить SQL Server Profiler, чтобы увидеть, что SQL фактически выполняется при запуске из кода.