2013-02-14 39 views
3

我想獲得所有的ID,其中文本列包含字符串過濾器。當我運行C#參數化查詢時,超時。與硬編碼參數相同的查詢工作正常

當我運行此參數化查詢,超時:

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(); 

這兩個查詢有什麼不同?我認爲參數化不僅僅是簡單的文本替換。

CLARIFICATION:我正在與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 
+1

'filter'包含什麼? – 2013-02-14 18:02:08

+0

這是一個字符串基元。 – Dahud 2013-02-14 18:02:57

+0

您可以運行SQL事件探查器並確保在執行時兩個查詢都相同嗎? – Shenaniganz 2013-02-14 18:04:04

回答

-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)); 

現在,它以最快的速度,我期望所有長度的查詢執行。

0

當使用paramaterized查詢與LIKE操作,你需要單引號通配符:

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

然後,只需添加參數和往常一樣:

cmd.Parameters.AddWithValue("@filter", filter);