如何逃避与SQL服务器LIKE操作使用字符串?(How to escape a string for

2019-07-18 03:12发布

我在寻找的东西,在类似于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说采取这种字面上还是有possbibly一个更好的解决办法,我没有想到的?

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

Answer 1:

要搜索“%”的文字不是通配符的字符串,它需要转义为[%]。

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

因此,创建一个标量UDF来包装这个:

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

因为简单的(又名:非常有限)模式匹配的SQL,需要什么更复杂的...



Answer 2:

在TSQL,你可以用括号中的%和_字符,像这样[%] [_]这告诉SQL对待它们当作文字。

我已经测试和验证这个作品在SQL Server 7.0,2000年和2005年。

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



Answer 3:

从字面上对待每个字符应放在方括号内。 右支架从字面上直接,所以不要附上一个。



Answer 4:

如果参数查询,你不必担心。

UPDATE

正如评论指出递归%仍然需要即使在参数化查询进行转义,我没有意识到的LINQ to SQL被自动地做这件事时,我测试。

你可以用ESCAPE“X”,其中x是字符,你希望成为转义字符。 LINQ到SQL做它像这样

WHERE [名] LIKE @searchText ESCAPE '〜'

其中@searchText = [一些文本用〜%字符%]

或者正如其他人说,它可以被转义[%]

查看该文档



Answer 5:

我消毒字符串中的前端应用程序,而不是在SQL尝试做做作的东西来解决这个问题。



Answer 6:

从该文档 :

句法

MATCH_EXPRESSION [NOT] LIKE 模式 [ESCAPE ESCAPE_CHARACTER]

使用ESCAPE像这样的选项:

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


Answer 7:

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

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

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

编辑:删除了有关使用“喜欢”搜索“%”不正确的说法。



文章来源: How to escape a string for use with the LIKE operator in SQL Server?