我想获取文本列包含字符串过滤器的所有 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
当使用带有 like 运算符的参数化查询时,需要将通配符用单引号引起来:
new SqlCommand("SELECT ID FROM TableName WHERE Text LIKE '%' + @filter + '%' ", conn);
然后像往常一样添加参数即可:
cmd.Parameters.AddWithValue("@filter", filter);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)