Получить имя файла, хранящееся в SQL Server - PullRequest
3 голосов
/ 03 февраля 2012

Прямой вопрос :)

У меня есть столбец, который хранится как таковой в SQL Server:

FileName    Attachments_21046_123400100473.pdf

Мне нужно захватить последний сегмент перед расширением файла, в этом случае это будет 123400100473.

Последний сегмент может различаться по размеру символов, поэтому здесь это 12 символов, но иногда это может быть 15.

Как лучше всего это сделать?

Ответы [ 5 ]

4 голосов
/ 03 февраля 2012

Я не уверен, сколько подчеркиваний стоит перед последним сегментом, поэтому я переворачиваю строку и нахожу первое подчеркивание ...

DECLARE @FileName VARCHAR(50)
SET @FileName = 'Attachments_21046_123400100473.pdf'

SELECT REVERSE(
        SUBSTRING(
        REVERSE(@FileName), 
        5, -- Length of extension + 1.
        CHARINDEX('_', REVERSE(@FileName)) - 5
    )
)
2 голосов
/ 03 февраля 2012

Вы можете довольно легко добиться этого с помощью комбинации функций T-SQL CHARINDEX и SUBSTRING .

Это немного странно, но зависит только от присутствияиз двух подчеркиваний и точка.Например, %_%_%.% Расширение может иметь любую длину, а также конечную подстроку:

РЕДАКТИРОВАТЬ: Обновлен для обработки переменных вхождения подчеркивания:

create function udfGetFileNameSubstring(@val as varchar(50))
returns varchar(50)
begin   
    --declare @val varchar(50)
    --set @val = 'Attachments_21046_123400100473.pdf'

    declare @uidx int
    -- establish the index of the 2nd underscore
    set @uidx = LEN(@val) - CHARINDEX('_', REVERSE(@val)) + 1

    declare @pidx int
    -- establish the index of the period
    set @pidx = CHARINDEX('.', @val) 

    return SUBSTRING(@val, @uidx + 1, @pidx - @uidx - 1)
end

-- usage:  SELECT dbo.udfGetFileNameSubstring(col_name) FROM table_name
-- sample: SELECT dbo.udfGetFileNameSubstring('Attachments_21046_123400100473.pdf')
-- OUTPUT: 123400100473

T-SQL, безусловно, может быть сокращен, и я бы обернул его в UDF для чистого использования в ваших запросах.

1 голос
/ 03 февраля 2012

SELECT SUBSTRING(f.FileName,0,CHARINDEX('.', f.FileName)) AS 'last_segment'

0 голосов
/ 03 февраля 2012

Если формат / длина всегда одинаковы .. это может быть самое простое.

select left(right(@Filename,16),12)
0 голосов
/ 03 февраля 2012
begin
DECLARE @a varchar(100) = 'Attachments_21046_123400100473.pdf';
DECLARE @b varchar(100) = REVERSE(@a)
SELECT SUBSTRING(@a, LEN(@a) - CHARINDEX('_', @b) + 2, CHARINDEX('_', @b) - CHARINDEX('.', @b) - 1)
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...