我正在寻找在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来说明这个字面意思还是可能是一个我没想到的更好的解决方案?
编辑:我不希望解决方案是客户端清理。我需要这个存储过程才能工作,而不依赖于被清理传递的数据。
答案 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 = [某些带有〜%字符%的文字]
或正如其他人所说,可以使用[%]
进行转义答案 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 '%'