我正在使用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
答案 0 :(得分:1)
据我所知,@ IncorrectMatchIndex字符串不包含与
之间没有破折号%<EstmatedTime>%T%-%</EstmatedTime>%
的匹配项。 T和结束</EstmatedTime>
是的。因为在字符串的后面有第二组<EstimatedTime>
标记,并且在 first T
和 last <之间肯定有一个'-'字符。 / em> </EstimatedTime>
答案 1 :(得分:1)
仅凭猜测,我怀疑您想要:
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>%'
然后返回0
的{{1}}。
当然,注释是正确的,您实际上应该使用XQUERY。但是,我无法为此提供示例,因为您没有提供有效XML的XML数据(例如IncorrectMatchIndex
以@CorrectMatchIndex
结尾,但从未打开该节点)。