我正在寻找在 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 + '%')

我的问题是如果他们放了一个 %, _ 或任何其他可能影响我的 like 子句的特殊字符。我希望匹配的行为就像“开头为”功能一样。那么,有什么我可以应用于@searchText来表示从字面上理解,或者是否有一个我没有想到的更好的解决方案?

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

有帮助吗?

解决方案

要在字符串中搜索“%”作为文字而不是通配符,需要将其转义为 [%]。

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

因此,创建一个标量 udf 来包装它:

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

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

其他提示

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

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

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

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

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

<强>更新

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

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

WHERE [Name] LIKE @searchText ESCAPE'〜'

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

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

进行转义

查看文档

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

来自文档

  

<强>语法

     

match_expression [NOT] LIKE pattern   [ESCAPE escape_character ]

使用 ESCAPE 选项,如下所示:

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top