14

我正在寻找在 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 来说明这个字面意思,或者是否有更好的解决方案我没有想到?

编辑:我不希望解决方案是客户端清洁。我需要这个存储过程在不依赖于被清理的数据的情况下工作。

4

7 回答 7

23

To search for "%" as a literal not wildcard in a string, it needs escaped as [%].

Now, SQL Server only need 3 characters escaping: % _ [

So, create a scalar udf to wrap this:

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

Because of the simplicity (aka: very limited) pattern matching in SQL, nothing more complex is needed...

于 2009-09-15T17:21:36.033 回答
9

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

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

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

于 2009-09-15T16:34:37.517 回答
0

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

更新

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

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

WHERE [名称] LIKE @searchText ESCAPE '~'

其中@searchText = [一些带有~% 字符的文本%]

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

查看文档

于 2009-09-15T16:42:59.123 回答
0

每个要按字面处理的字符都应该用方括号括起来。右括号是直接取的,所以不要把那个括起来。

于 2009-09-15T16:29:04.907 回答
-1

文档

句法

match_expression [ NOT ] LIKE模式 [ ESCAPE escape_character ]

像这样使用ESCAPE选项:

SELECT [Name] 
  FROM [Test] 
 WHERE [Name] LIKE (REPLACE(@searchText, '%', '%%') + '%') ESCAPE '%'
于 2009-09-15T16:44:54.360 回答
-1

我会清理前端应用程序中的字符串,而不是尝试在 SQL 中做一些虚伪的事情来解决这个问题。

于 2009-09-15T16:31:50.767 回答
-1

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

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

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

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

于 2009-09-15T16:39:20.690 回答