2012-02-03 86 views
3

直截了當的問題:)獲取文件名在SQL Server存儲

我有一個存儲例如SQL Server中的列:

FileName Attachments_21046_123400100473.pdf 

我需要抓住的文件擴展名之前的最後段在這種情況下,它將是123400100473

最後一段可能的字符大小各不相同,所以這裏是12個字符,但有時也可能是15

什麼會去了解這一點的最好方法是什麼?

回答

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 
    ) 
) 
+0

格式總是相同的,它實際上是「Attachments_IDNumber_SecondNumber.PDF」 – RogueSpear00 2012-02-03 17:09:16

+0

@ RogueSpear00啊,好吧......我就這樣離開它,因爲即使我知道前導下劃線的數量,它看起來不漂亮。 – 2012-02-03 17:13:57

+0

這工作。現在我必須理解這個陳述。 – RogueSpear00 2012-02-03 17:26:33

2

通過組合T-SQL的CHARINDEXSUBSTRING函數,您可以非常輕鬆地完成此任務。

這是一個小黑客,但只取決於兩個下劃線和一段時間的存在。例如%_%_%.%擴展名可以是任意長度,以及最終的字符串:

編輯:更新處理變量下劃線出現:

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中用於查詢中的清潔使用。

+0

我翻查了一些數據,並且有一些字段有一個以上的下劃線。但是,這些是我可以忽略的記錄。這不會解決你的問題,是嗎? – RogueSpear00 2012-02-03 17:41:46

+0

@ RogueSpear00:它會絆倒我的解決方案。我會調整它來處理變量下劃線。 – 2012-02-03 18:00:28

+0

@ RogueSpear00:其實很簡單。檢查編輯的代碼 – 2012-02-03 18:06:15

1

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

+2

您的答案返回整個文件名。我正在嘗試獲取最後一部分,請參閱我在文件名示例下編寫的內容。 – RogueSpear00 2012-02-03 17:06:55

+1

你應該有足夠的空間來解決這個問題。看看tsql的字符串函數 – 2012-02-03 17:14:51

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; 
0

如果格式/長度總是相同的。這可能是最簡單的。

select left(right(@Filename,16),12) 
相關問題