Tsql PATINDEX、通配符和变量

Tsql PATINDEX、通配符和变量,tsql,sql-server-2012,wildcard,patindex,Tsql,Sql Server 2012,Wildcard,Patindex,如何让PATINDEX对包含%字符的变量进行通配符卡匹配 在下面的示例中,我希望PATINDEX返回“%3d”的起始位置: DECLARE @inputText as VARCHAR(100) DECLARE @s as Int DECLARE @cIn as CHAR(3) SET @inputText = 'OEi49j3DNxE%3d' SET @cIn = '%3d' SET @s = PATINDEX('%' + @cIn +'%', @InputText) 从@InputT

如何让
PATINDEX
对包含
%
字符的变量进行通配符卡匹配

在下面的示例中,我希望
PATINDEX
返回“%3d”的起始位置:

DECLARE @inputText as VARCHAR(100)
DECLARE @s as Int   
DECLARE @cIn as CHAR(3)

SET @inputText = 'OEi49j3DNxE%3d'
SET @cIn = '%3d'
SET @s = PATINDEX('%' + @cIn +'%', @InputText)
@InputText
中可以看到,这从位置12开始

OEi49j3DNxE%3d

但是
PATINDEX
似乎返回7的开始位置,因为它似乎从
CIn
中删除了
%

OEi49j3DNxE%3D


如何按指定查找
%3d
,而不是
3d

您可以使用方括号:

SET @cIn = '[%]3d'

rextester演示:

返回:

+------------------+---------------+
| without_brackets | with_brackets |
+------------------+---------------+
|                7 |            12 |
+------------------+---------------+

可以使用方括号:

SET @cIn = '[%]3d'

rextester演示:

返回:

+------------------+---------------+
| without_brackets | with_brackets |
+------------------+---------------+
|                7 |            12 |
+------------------+---------------+

您必须用[]换行以避开%符号。为了做到这一点,您必须将变量@cIn变大以容纳额外的2个字符,并且只需在执行patindex之前进行替换,或者您可以在不更改变量大小的情况下进行内联操作

DECLARE @inputText as VARCHAR(100)
DECLARE @s as Int   
DECLARE @cIn as CHAR(5)

SET @inputText = 'OEi49j3DNxE%3d'
SET @cIn = '%3d'
SET @cIn = REPLACE(@cIn, '%', '[%]')
SET @s = PATINDEX('%' + @cIn +'%', @InputText)


您可以在此处阅读更多信息:

您必须用[]换行%符号。为了做到这一点,您必须将变量@cIn变大以容纳额外的2个字符,并且只需在执行patindex之前进行替换,或者您可以在不更改变量大小的情况下进行内联操作

DECLARE @inputText as VARCHAR(100)
DECLARE @s as Int   
DECLARE @cIn as CHAR(5)

SET @inputText = 'OEi49j3DNxE%3d'
SET @cIn = '%3d'
SET @cIn = REPLACE(@cIn, '%', '[%]')
SET @s = PATINDEX('%' + @cIn +'%', @InputText)

您可以在此处阅读更多信息:

产出:12


输出:12

被选为答案,因为提供的备选方案对我有效(
cIn
正在其他地方使用,并且将其存储为
[%]3d
会导致其他问题)。谢谢:)投票作为答案,因为提供的备选选项对我有效(
cIn
正在其他地方使用,将其存储为
[%]3d
会导致其他问题)。谢谢:)完全正确-只使用@Avitus,因为提供的替代方案在我的完整代码中工作得更好。谢谢。完全正确-只使用@Avitus,因为提供的替代方案在我的完整代码中工作得更好。谢谢。正确,非常感谢-只使用了@Avitus,因为在我的完整代码中提供的替代方案工作得更好。谢谢。正确,非常感谢-只使用了@Avitus,因为在我的完整代码中提供的替代方案工作得更好。谢谢