一部の全文検索クエリ、特に複数の単語を含むクエリで奇妙な動作が発生しています。これらは、Management Studio を介して実行すると正常に動作しますが、コードから呼び出すと結果が返されません。アプリからどのコマンドが送信されているかを確認するために SQL トレースを実行しました。Management Studio から実行するとまったく同じコマンドが結果として返されますが、ExecuteReader メソッドを使用してアプリから呼び出された場合は結果が返されません。
この呼び出し:
exec dbo.FullTextSearch_Articles @ftsQuery=N' FORMSOF (INFLECTIONAL, moravec) '
このコマンドを実行すると、アプリと Management Studio の両方のデータが返されます。
exec dbo.FullTextSearch_Articles @ftsQuery=N'( FORMSOF (INFLECTIONAL, jan) AND FORMSOF (INFLECTIONAL, moravec) )'
Management Studio から実行された場合にのみデータを返します。これらのクエリをトレース ログから直接コピーして貼り付けました。
コード側では、Enterprise Library を使用していますが、全体的な DB 呼び出しは非常に単純です。
using (var dataReader = (SqlDataReader)db.ExecuteReader(cmd))
{
if (dataReader.HasRows)
{
var results = new List<IFullTextSearchItem>();
while (dataReader.Read())
{
results.Add(CreateArticleSearchFromReader(dataReader));
}
return results;
}
return null;
}
2 番目のケースでは、何らかの理由で dataReader.HasRows が false ですが、Management Studio からこれらのクエリを実行すると、両方ともデータが返されます。
返された行の数が原因である可能性があると思いましたが (2 番目のクエリははるかに大きな結果セットを返します)、さらに多くの行が返された単一単語検索のテストに成功しました。
DataReader が単純な Management Studio クエリの実行とは異なる動作をする理由を理解していただければ幸いです。
ありがとう、
アントニン