如何转义字符串以便与SQL Server中的LIKE运算符一起使用?

时间:2009-09-15 16:24:40

标签: sql sql-server tsql pattern-matching

我正在寻找在SQL Server中有效的东西,类似于c#中的@符号,这会导致字符串被视为文字。例如:

string text = "abcd\\efg";
Output of text = abcd\efg

string text = @"abcd\\efg";
Output of text = abcd\\efg

注意@如何影响字符串以按原样取出每个字符。

现在我不确定这是否可行,但这是我的问题,也许还有更好的解决方法。请考虑以下基本查询:

SELECT [Name] 
  FROM [Test] 
 WHERE [Name] LIKE (@searchText + '%')

我的问题是,如果他们放置%_或任何其他可能影响我喜欢条款的特殊字符。我希望这场比赛就像一个'开始'功能。那么有什么我可以应用于@searchText来说明这个字面意思还是可能是一个我没想到的更好的解决方案?

编辑:我不希望解决方案是客户端清理。我需要这个存储过程才能工作,而不依赖于被清理传递的数据。

7 个答案:

答案 0 :(得分:17)

要在字符串中搜索“%”作为文字而非通配符,它​​需要以[%]的形式进行转义。

现在,SQL Server只需要3个字符转义:%_ [

所以,创建一个标量udf来包装它:

REPLACE(REPLACE(REPLACE(@myString, '[', '[[]'), '_', '[_]'), '%', '[%]')

由于SQL中的简单(又名:非常有限)模式匹配,所以不需要复杂......

答案 1 :(得分:9)

在TSQL中,你可以将%和_字符包装在括号中,如[%] [_]这告诉SQL将它们视为文字。

我已在SQL Server 7.0,2000和2005中测试并验证了此功能。

http://msdn.microsoft.com/en-us/library/aa933232(SQL.80).aspx

答案 2 :(得分:0)

字面上要对待的每个字符都应该用方括号括起来。右括号直接采用直接拍摄,因此不要将其括起来。

答案 3 :(得分:0)

如果您参数化查询,则无需担心。

<强>更新

正如评论中所说的递归,即使在参数化查询中仍然需要转义%,我没有意识到linq to sql在我测试时是自动执行的。

您可以使用ESCAPE'x',其中x是您希望成为转义字符的字符。 Linq to SQL就像这样

WHERE [Name] LIKE @searchText ESCAPE'〜'

其中@searchText = [某些带有〜%字符%的文字]

或正如其他人所说,可以使用[%]

进行转义

view the documentation

答案 4 :(得分:-1)

我会清理前端应用程序中的字符串,而不是尝试在SQL中使用hokey来解决这个问题。

答案 5 :(得分:-1)

如果您不想修改传入文本,可以使用“LEFT”功能创建自己的“STARTSWITH”:

SELECT [Name] 
  FROM [Test] 
 WHERE @searchText = LEFT( [Name], LEN( @searchText ) )

(注意,您可能需要做额外的工作来处理NULL或空字符串的情况。)

编辑:删除了关于使用“LIKE”搜索“%”的错误陈述。

答案 6 :(得分:-1)

来自the docs

  

<强>语法

     

match_expression [NOT] LIKE pattern   [ESCAPE escape_character ]

使用ESCAPE选项,如下所示:

SELECT [Name] 
  FROM [Test] 
 WHERE [Name] LIKE (REPLACE(@searchText, '%', '%%') + '%') ESCAPE '%'