3

我想获取 Text 列包含字符串过滤器的所有 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();

这两个查询在哪些方面有所不同?我认为参数化不仅仅是简单的文本替换。

澄清:我正在与 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 回答