SQL Server Express 2008 R2 - 文本字段中的方括号不返回结果

时间:2010-12-18 13:11:46

标签: sql-server tsql

我创建了一个带有一些默认值的简单存储过程,以便自定义搜索我的“MachineModel”数据库。

作为WHERE子句的一部分,我有这样的事情:

Model.[ModelName] LIKE '%' + ISNULL(@ModelName, Model.[ModelName]) + '%' 

应该允许部分匹配。这适用于大多数模型,但是如果没有为@ModelName提供任何值(因此ISNULL解析为Model。[ModelName])并且基础字段数据包含方括号,例如“Lenny的测试模型[2010]”,然后,SProc不会返回那些记录记录。

这不是一个大问题,因为只有4个模型(大约120,000个)在名字中实际上有方括号,所以我可以很容易地改变它们,但是我很想知道发生了什么以及解决的最佳方法是什么此

干杯,

莱尼。

2 个答案:

答案 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的位置