テキスト列に文字列フィルターが含まれているすべての ID を取得したいと考えています。
このパラメーター化されたクエリを実行すると、タイムアウトになります。
SqlCommand cmd =
new SqlCommand("SELECT ID FROM TableName WHERE Text LIKE @filter", conn);
if (filter != null)
{
cmd.Parameters.AddWithValue("@filter", "%" + filter + "%");
SqlDataReader reader;
reader = cmd.ExecuteReader(); //Locks up here!
}
ハードコーディングされた検索パラメーターを使用して同じコードを実行すると、必要な結果がタイムリーに返されます。
SqlCommand cmd =
new SqlCommand("SELECT ID FROM TableName WHERE Text LIKE '%patternToMatch%'", conn);
SqlDataReader reader;
reader = cmd.ExecuteReader();
2 つのクエリの違いは何ですか? パラメータ化は、単純なテキストの置換以上のことをしていると思います。
明確化: Microsoft SQL Server 2012 サーバーと話しています。
新しい情報: 検索フィルターが 6 文字を超える場合にのみタイムアウトします。
編集:解決しました!検索をストアド プロシージャとして設定しました。
CREATE PROCEDURE TextSearch
@filter varchar(MAX) = ''
AS
BEGIN
SET NOCOUNT ON;
SELECT DISTINCT ID FROM TableName WHERE [Text] LIKE '%' + @filter + '%'
END
GO