SQL Server 'LIKE' or varchar issue



我有一个存储过程,它通过我传递到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]%'将返回columnabc开头的所有记录,而WHERE column LIKE '[^a-c]%'将返回Column不以abc开头的所有记录。

您可以通过将[字符包装在[]中来转义: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 '['

只需对其中一个方括号进行转义,即可避免括号绑定字符类。

最新更新