Неожиданные результаты с PATINDEX - PullRequest
0 голосов
/ 13 декабря 2018

Я работаю над некоторыми строковыми манипуляциями с PATINDEX, чтобы исправить неправильное форматирование времени в XML, например (2018-12-20T17: 00: 00-05: 00).

У меня проблема с PATINDEX.находит соответствие @Pattern в строке @IncorrectMatchIndex.

Вы можете воссоздать проблему, выполнив следующую команду:

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

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

На чистом предположении, я подозреваю, что вы хотите:

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 для IncorrectMatchIndex.

Конечно, комментарии правильные, вы должны действительноиспользовать XQUERY для этого.Однако я не могу предоставить пример для этого, поскольку ни один из предоставленных вами XML-данных не является допустимым XML (например, @CorrectMatchIndex заканчивается '</Rate>', но этот узел никогда не открывается).

0 голосов
/ 13 декабря 2018

Строка @IncorrectMatchIndex, насколько я вижу, не содержит совпадения с %<EstmatedTime>%T%-%</EstmatedTime>%.Между Т и закрытием нет тире </EstmatedTime>

Да, есть.Поскольку позже в строке есть второй набор <EstimatedTime> тегов, и между символами first T и last </EstimatedTime> наверняка есть символ '-'

...