Полнотекстовый запрос SQL - ведет себя по-разному в зависимости от того, как я вызываю хранимую процедуру - PullRequest
2 голосов
/ 06 декабря 2011

Я столкнулся с запутанной проблемой.

У меня есть хранимая процедура в базе данных 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?Я что-то упустил?

РЕДАКТИРОВАТЬ: Казалось бы, нет ничего плохого в вышесказанном.Я нашел решение, которое может даже быть ошибкой в ​​SQL / .NET.Смотрите мой ответ ниже.

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Нашли решение.

Код, который я не показывал вам, был таким, каким я читал свое устройство чтения данных на странице 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
    ...
}

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

1 голос
/ 07 декабря 2011

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

...