获取存储在SQL Server中的文件名

时间:2012-02-03 16:58:34

标签: sql sql-server-2005 select

直截了当的问题:)

我有一个在SQL Server中存储的列:

FileName    Attachments_21046_123400100473.pdf

我需要在文件扩展名之前抓取最后一段,在这种情况下,它将是123400100473

最后一个段的字符大小可能会有所不同,所以这里有12个字符,但有时可能是15个字符。

最好的方法是什么?

5 个答案:

答案 0 :(得分:4)

我不确定在最后一段之前有多少下划线,所以我将字符串反转并找到第一个下划线...

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

SELECT REVERSE(
        SUBSTRING(
        REVERSE(@FileName), 
        5, -- Length of extension + 1.
        CHARINDEX('_', REVERSE(@FileName)) - 5
    )
)

答案 1 :(得分:2)

通过结合使用T-SQL CHARINDEXSUBSTRING函数,您可以轻松实现这一目标。

这有点hacky但只取决于两个下划线和一个句号的存在。例如%_%_%.%扩展名可以是任意长度以及最终子字符串:

编辑:已更新以处理变量下划线出现次数:

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中以便在查询中使用。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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;

答案 4 :(得分:0)

如果格式/长度始终相同..这可能是最简单的。

select left(right(@Filename,16),12)