У меня есть столбец 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
Исходя из этого, я бы предположил, что смогу вернуть это обратно в строку, а затем выполнить некоторую функцию instring или charindex, чтобы выяснить, где находятся символы подчеркивания, чтобы я мог инкапсулировать все это в функцию подстроки, чтобы выбрать часть Я нуждаюсь. Не заходя слишком далеко в это, я почти уверен, что в конечном итоге смогу сделать это таким образом, но я знаю, что должен быть более простой способ. Таким образом, в операторе SQL появилось бы огромное нечитаемое поле, которое, даже если бы я переместил его в функцию, все равно сбивало бы с толку, пытаясь понять, что происходит.
Я уверен, что это проще, чем это, поскольку это кажется простой манипуляцией со строками. Возможно, кто-то может указать мне в правильном направлении. Спасибо