3

テキスト列に文字列フィルターが含まれているすべての 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
4

2 に答える 2

0

like 演算子でパラメーター化されたクエリを使用する場合は、ワイルドカード文字を一重引用符で囲む必要があります。

new SqlCommand("SELECT ID FROM TableName WHERE Text LIKE '%' + @filter + '%' ", conn);

次に、通常どおりパラメーターを追加します。

cmd.Parameters.AddWithValue("@filter", filter);
于 2013-02-14T18:50:35.153 に答える
-1

解決しました!検索をストアド プロシージャとして設定しました。

SQL:

CREATE PROCEDURE TextSearch 
@filter varchar(MAX) = ''
AS
BEGIN
    SET NOCOUNT ON;
    SELECT DISTINCT ID FROM TableName WHERE [Text] LIKE '%' + @filter + '%'
END
GO

C#:

 SqlCommand cmd = new SqlCommand("TextSearch", conn);
 cmd.CommandType = CommandType.StoredProcedure;
 cmd.Parameters.Add(new SqlParameter("@filter", filter));

今では、あらゆる長さのクエリに対して期待どおりの速さで実行されます。

于 2013-02-14T19:17:35.880 に答える