У меня есть столбец varchar в таблице, которая используется для хранения данных XML. Да, я знаю, что есть тип данных xml, который я должен использовать, но я думаю, что он был настроен до того, как тип данных xml был доступен, поэтому сейчас мне нужно использовать varchar. :)
Сохраненные данные выглядят примерно так:
<xml filename="100100_456_484351864768.zip"
event_dt="10/5/2009 11:42:52 AM">
<info user="TestUser" />
</xml>
Мне нужно разобрать имя файла, чтобы получить цифры между двумя подчеркиваниями, которые в этом случае были бы "456". Первая часть имени файла «не должна» меняться по длине, но среднее число будет. Мне нужно решение, которое будет работать, если первая часть действительно изменится по длине (вы знаете, что она изменится, потому что «не должно меняться» всегда означает, что она изменится).
Для того, что у меня сейчас есть, я использую XQuery, чтобы вытащить имя файла, потому что я подумал, что это, вероятно, лучше, чем манипуляции с прямыми строками. Для этого я привел строку в xml, но я не эксперт по XQuery, поэтому, конечно, у меня возникают проблемы. Я нашел функцию для XQuery (substring-before), но не смог заставить ее работать (я даже не уверен, что функция будет работать с SQL Server). Может быть, есть функция XQuery, чтобы сделать это легко, но если она есть, я не знаю об этом.
Итак, я получаю имя файла из таблицы с помощью запроса, подобного следующему:
select CAST(parms as xml).query('data(/xml/@filename)') as p
from Table1
Исходя из этого, я предполагаю, что я смогу CAST это обратно в строку, а затем выполнить некоторую функцию instring или charindex, чтобы выяснить, где находятся подчеркивания, чтобы я мог инкапсулировать все это в функцию подстроки, чтобы выбрать часть, в которой я нуждаюсь. Не вдаваясь слишком далеко в это, я почти уверен, что смогу сделать это таким образом, но я знаю, что должен быть более легкий путь. Таким образом, в операторе SQL появилось бы огромное нечитаемое поле, которое, даже если бы я переместил его в функцию, все равно не смогло бы понять, что происходит.
Я уверен, что это проще, так как это кажется простой обработкой строк. Возможно, кто-то может указать мне правильное направление. Спасибо