采用以下示例(SQL Server 2008 - 可能更多)。你必须想象@query
是一个参数,其来源是用户输入:
DECLARE @query varchar(100)
SET @query = 'less than 1% fat'
CREATE TABLE X ([A] VARCHAR(100))
INSERT X VALUES ('less than 1% fat')
INSERT X VALUES ('less than 1% of doctors recommend this - it''s full of fat!')
SELECT * FROM X WHERE A LIKE '%' + @query + '%'
DROP TABLE X
查询说明了'less than 1% fat'
,但实际上我们获得了超出我们想要的内容:
less than 1% fat
less than 1% of doctors recommend this - it's full of fat!
要获得所需的行为,我将@query
更改为'less than 1[%] fat'
- 然后只返回第一个结果。
是否有标准方法为使用LIKE
s的子句准备字符串,还是我必须自己滚动?
答案 0 :(得分:6)
您可以使用自由文本搜索和CONTAINS或FREETEXT谓词,而不是使用LIKE。 LIKE使用前导通配符忽略索引并导致全表扫描,而全文搜索使用现有的自由文本索引来加速搜索。您必须先配置free text indexing才能使用它。
如果你想坚持使用LIKE,最好的解决办法就是逃避客户端代码中的字符串。 T-SQL提供非常有限的字符串操作功能,REPLACE函数甚至不接受通配符。您必须嵌套多个REPLACE语句以考虑LIKE使用的所有通配符。
如果您的搜索字符串可能包含[或]字符,您可以将它与ESCAPE子句组合使用,例如§,¶或¤等稀有字符作为转义字符。
答案 1 :(得分:6)
SQL Server允许您指定escape character,然后您可以在使用之前转义查询字符串。
我链接的MSDN页面中的示例:
SELECT c1
FROM mytbl2
WHERE c1 LIKE '%10-15!% off%' ESCAPE '!';