我有一个存储过程,它通过我传递到varchar
的字符串搜索列上的表。
这有效,返回具有正确ING_LOC_DESCRIPTION的特定记录
DECLARE @strSearch VARCHAR(500)
SET @strSearch = 'Care1st LETTER Location'
SELECT TOP 10 ING_LOC_DESCRIPTION
FROM [CDRS].[ING_LOC_TRANS_MASTER]
WHERE [ING_LOC_DESCRIPTION] LIKE '%' + @strSearch + '%'
ORDER BY [ING_LOC_ID]
这不起作用,返回按ING_LOC_ID
排序的所有记录中的前十个结果:
DECLARE @strSearch VARCHAR(500)
SET @strSearch = '[{"WorkFlowID":"MoveFile"}]'
SELECT TOP 10 ING_LOC_DESCRIPTION
FROM [CDRS].[ING_LOC_TRANS_MASTER]
WHERE [ING_LOC_DESCRIPTION] LIKE '%' + @strSearch + '%'
ORDER BY [ING_LOC_ID]
这些字符中的任何一个在varchar
中是否无效?它被解释为 2 个字符串吗?还是LIKE
关键字有问题?
字符串赋值似乎没问题,因为
DECLARE @strSearch VARCHAR(500)
SET @strSearch = '[{"WorkFlowID":"MoveFile"}]'
SELECT @strSearch
返回
[{"WorkFlowID":"MoveFile"}]
不幸
DECLARE @strSearch VARCHAR(500)
SET @strSearch = '[{"WorkFlowID":"MoveFile"}]'
SELECT @strSearch LIKE '[{"WorkFlowID":"MoveFile"}]'
没有像我希望的那样返回真或假,它返回一个错误
消息 156,级别 15,状态 1,第 3
行 关键字"LIKE"附近的语法不正确
我认为LIKE
只能在WHERE
子句中使用,所以我认为这并不能证明使用LIKE
的问题。
是的。 在LIKE
中,[
/]
限定一个字符类。 因此,代码匹配包含{
或"
或W
等的任何值。
我建议使用不同的方法:
SELECT TOP 10 ING_LOC_DESCRIPTION
FROM [CDRS].[ING_LOC_TRANS_MASTER]
WHERE CHARINDEX(@strSearch, ING_LOC_DESCRIPTION) > 0
ORDER BY [ING_LOC_ID];
简单字符串匹配中没有通配符。
您需要转义特殊字符:
SQL LIKE 子句的特殊字符列表
与 ESCAPE 子句的模式匹配
[
]
字符在 T-SqlLIKE
中具有特殊含义 - 它们用于模式搜索。
例如:WHERE column LIKE '[a-c]%'
将返回column
以a
、b
或c
开头的所有记录,而WHERE column LIKE '[^a-c]%'
将返回Column
不以a
、b
或c
开头的所有记录。
您可以通过将[
字符包装在[]
中来转义:WHERE column LIKE '[[]a]%'
将返回列以[a]
开头的所有记录(无需转义右括号(。
有关详细信息,请阅读like
运算符的参数,以及在同一页下方使用通配符作为文字。
Gordon的回答可能是最简洁的方法,但这里有一个使用ESCAPE
的例子:
SELECT TOP 10 ING_LOC_DESCRIPTION
FROM [CDRS].[ING_LOC_TRANS_MASTER]
WHERE [ING_LOC_DESCRIPTION] LIKE '%'+@strSearch+'%' ESCAPE '['
只需对其中一个方括号进行转义,即可避免括号绑定字符类。