我创建了一个带有一些默认值的简单存储过程,以便自定义搜索我的“MachineModel”数据库。
作为WHERE子句的一部分,我有这样的事情:
Model.[ModelName] LIKE '%' + ISNULL(@ModelName, Model.[ModelName]) + '%'
应该允许部分匹配。这适用于大多数模型,但是如果没有为@ModelName提供任何值(因此ISNULL解析为Model。[ModelName])并且基础字段数据包含方括号,例如“Lenny的测试模型[2010]”,然后,SProc不会返回那些记录记录。
这不是一个大问题,因为只有4个模型(大约120,000个)在名字中实际上有方括号,所以我可以很容易地改变它们,但是我很想知道发生了什么以及解决的最佳方法是什么此
干杯,
莱尼。
答案 0 :(得分:3)
您需要用[[]
LIKE中有3个字符有意义:% _ [
。您无需转义尾随括号。
为了完整性:
Model.[ModelName] LIKE '%' + ISNULL(
--don't do it the other way around!
REPLACE(REPLACE(REPLACE(@ModelName, '[', '[[]), '%', '[%]), '_', '[_]),
Model.[ModelName]) + '%'
答案 1 :(得分:1)
为什么在null搜索参数的情况下将模型与自身进行比较?这很贵。
将SQL Server与昂贵的SQL Server混合使用也不是很好的做法,但可以这样做:
Where (
@ModelName is null OR
(ModelName is not null AND ModelName LIKE '%' + @ModelName + '%')
)
如果表现可能是一个问题,那么引入一个if会有所帮助,但你最终会复制你的选择
if @ModelName is null
select * from ...
else
select ...
where ModelName LIKE '%' + @ModelName + '%'
你可以,但它会扰乱你的dba,在代码中构建sql并使用sqlparameters并且只添加此var不为null的位置