Sql PATINDEX的意外结果

Sql PATINDEX的意外结果,sql,sql-server,replace,pattern-matching,matching,Sql,Sql Server,Replace,Pattern Matching,Matching,我正在使用PATINDEX进行一些字符串操作,以修复XML中的一些错误时间格式,例如(2018-12-20T17:00:00-05:00) 我遇到的问题是PATINDEX在@IncorrectMatchIndex字符串中查找与@Pattern的匹配项 您可以通过运行以下命令重新创建问题: DECLARE @Pattern nvarchar(36) = '%<EstmatedTime>%T%-%</EstmatedTime>%', @CorrectMatch

我正在使用PATINDEX进行一些字符串操作,以修复XML中的一些错误时间格式,例如(2018-12-20T17:00:00-05:00)

我遇到的问题是PATINDEX在@IncorrectMatchIndex字符串中查找与@Pattern的匹配项

您可以通过运行以下命令重新创建问题:

DECLARE @Pattern nvarchar(36) = '%<EstmatedTime>%T%-%</EstmatedTime>%',
        @CorrectMatchIndex nvarchar(100) = '<DiscountedRate>263.34</DiscountedRate><EstmatedTime>2018-12-20T17:00:00-05:00</EstmatedTime></Rate>',
        @CorrectMatchIndex2 nvarchar(94) = '<DiscountedRate>263.34</DiscountedRate><EstmatedTime>2018-12-20T17:00:00</EstmatedTime></Rate>',
        @IncorrectMatchIndex nvarchar(296) = '<DiscountedRate>263.34</DiscountedRate><EstmatedTime>2018-12-20T17:00:00</EstmatedTime></Rate><Rate><Carrier>FedEx Freight</Carrier><Service>FEDEX_FREIGHT_PRIORITY</Service><PublishedRate>520.6</PublishedRate><DiscountedRate>272.04</DiscountedRate><EstmatedTime>2018-12-18T17:00:00</EstmatedTime>'

SELECT
  PATINDEX(@Pattern, @CorrectMatchIndex) AS CorrectMatchIndex,
  PATINDEX(@Pattern, @CorrectMatchIndex2) AS CorrectMatchIndex2,
  PATINDEX(@Pattern, @IncorrectMatchIndex) AS IncorrectMatchIndex
DECLARE@Pattern nvarchar(36)='%%T%-%%',
@CorrectMatchIndex nvarchar(100)='263.342018-12-20T17:00:00-05:00',
@CorrectMatchIndex2 nvarchar(94)='263.342018-12-20T17:00:00',
@不正确的匹配索引nvarchar(296)='263.342018-12-20T17:00:00联邦快递运费优先520.6272.042018-12-18T17:00:00'
挑选
PATINDEX(@Pattern,@CorrectMatchIndex)作为CorrectMatchIndex,
PATINDEX(@Pattern,@CorrectMatchIndex2)作为CorrectMatchIndex2,
PATINDEX(@Pattern,@IncorrectMatchIndex)作为IncorrectMatchIndex

就我所见,@IncorrectMatchIndex字符串不包含与
%%T%%-%%
的匹配项。T和关闭之间没有破折号

有。因为字符串后面还有第二组
标记,而且在第一个
T
和最后一个
之间肯定有一个“-”字符


就我所见,@IncorrectMatchIndex字符串不包含与
%%T%%-%%
的匹配项。T和关闭之间没有破折号


有。因为字符串后面有第二组
标记,而且在第一个
T
和最后一个
之间肯定有一个“-”字符,我猜想您想要:

DECLARE @Pattern nvarchar(300) = '%<EstmatedTime>[1-2][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]-[0-9][0-9]:[0-9][0-9]</EstmatedTime>%'
DECLARE@Pattern nvarchar(300)='%[1-2][0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]:
然后返回
不正确匹配索引的
0


当然,评论是对的,您应该使用XQUERY来实现这一点。但是,我无法提供此示例,因为您提供给它的XML数据中没有一个是有效的XML(例如,
@CorrectMatchIndex
'
结尾,但该节点从未打开)。

仅凭猜测,我怀疑您想要:

DECLARE @Pattern nvarchar(300) = '%<EstmatedTime>[1-2][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]-[0-9][0-9]:[0-9][0-9]</EstmatedTime>%'
DECLARE@Pattern nvarchar(300)='%[1-2][0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]:
然后返回
不正确匹配索引的
0


当然,评论是对的,您应该使用XQUERY来实现这一点。我不能提供一个示例,但是,因为您提供的XML数据中没有一个是有效的XML(例如<代码> @ ErrTrMatCHIDEX < /代码>以“代码>”/“代码”结尾,但该节点从未打开)。

如果您对这项工作有长期的需要,那么考虑使用适当的XML解析器。code>PATINDEX
很快就会失败,我认为所有这些结果都是正确的。你为什么认为他们错了?我同意蒂姆的看法。SQL Server具有本机XML数据类型、XQuery和XPath支持,对此不使用PATINDEX。就我所见,@IncorrectMatchIndex字符串不包含与“%%t%-%%”的匹配项。T和结束标记之间没有破折号。@AlecThomas,是的<代码>“
位于位置40。在接下来的时间里,您有一个
'T'
。然后,在字符串末尾(代码< > 2018—1218t17:00 00 '/CODE >)中,HypPing(<代码> -/COD>)和<代码> <代码>,返回的值(40)是正确的,因为这是匹配字符串开始的地方。如果您对这项工作有长期的需要,那么考虑使用适当的XML解析器。code>PATINDEX很快就会失败,我认为所有这些结果都是正确的。你为什么认为他们错了?我同意蒂姆的看法。SQL Server具有本机XML数据类型、XQuery和XPath支持,对此不使用PATINDEX。就我所见,@IncorrectMatchIndex字符串不包含与“%%t%-%%”的匹配项。T和结束标记之间没有破折号。@AlecThomas,是的<代码>“位于位置40。在接下来的时间里,您有一个
'T'
。然后在字符串的末尾有一个hyhpen(
-
)和
'
'2018-12-18T17:00:00'
)返回的值(40)是正确的,因为匹配的字符串就是从这里开始的。是的,为了简化起见,我没有在这个示例中复制整个XML。谢谢你的帮助,我会考虑你的家伙建议XQuery。Yea,为了简化,我没有复制整个XML为这个例子。谢谢你的帮助,我会考虑XQuery每个人的建议。