我有一个非常复杂的查询,正在修复我喜欢的术语(我作为一个单独的数据库表并将它们加载到我的搜索查询中),但是当我参数化它时,我的查询给出了不同的结果。
所以旧的查询有类似的部分:
((v.title = ''BA'') OR (vs.label = ''BA'') OR
(v.title LIKE ''BA %'') OR (vs.label LIKE ''BA %''))
...
我用这样的东西替换它(带参数):
((v.title = @banone) OR (vs.label = @banone) OR
(v.title LIKE @baright) OR (vs.label LIKE @baright))
...
@banone=N'BA',@baright=N'BA %',
...
我的参数添加如下:
string key = "ba";
string val = "ba";
parameters.Add("@" + key + "none", val);
parameters.Add("@" + key + "right", val + " %");
这两个查询是否相同?我错过了什么吗?
答案 0 :(得分:2)
(
(v.title = @banone) OR (vs.label = @banone) OR
(v.title LIKE @banone + ' %') OR (vs.label LIKE @banone + ' %')
)
...
@banone=N'BA'
...
答案 1 :(得分:1)
前两个或案例没有理由存在。如果您只使用LIKE情况,您将捕获相同的记录。例如:
(v.title LIKE @banone + ' %') OR (vs.label LIKE @banone + ' %')
其中@ banone ='BA'
我认为你的参数添加代码不对。
这parameters.Add("@" + key + "right", val + " %");
应为parameters.AddWithValue("@" + key +"right", val + "%");
有两点需要注意。首先,我在百分号前删除了空格。其次,我使用AddWithValue而不是普通的Add。
然后回到你的问题是这个空间是否重要。回顾一下您的原始查询,搜索title = 'BA' or title LIKE 'BA %'
实际上会忽略标题的值为 BAT 的内容,但会提取一个标题,例如 BA Something < / p>
您可能希望发布您正在使用的数据以及您收到的结果。