2012-02-03 4 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

+0

@ RogueSpear00ああ、まあ...とにかく私はそれを残して、とにかく、私が先頭のアンダースコアの数を知っても、それはどんなに美しく見えません。 –

+0

これは機能しました。今私はその声明を理解しなければならない。 – RogueSpear00

2

T-SQLのCHARINDEXSUBSTRINGの機能を組み合わせることで、これを簡単に実現できます。

これは少しハッキリですが、2つのアンダースコアと1つのピリオドの存在のみに依存します。例えば

EDIT:処理するために、更新された変数下線出現:%_%_%.%拡張子は任意の長さだけでなく、最終的にサブすることができ

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

+0

@ RogueSpear00:それは私の解決策をトリップするでしょう。私は変数の下線を扱うためにそれを微調整します。 –

+0

@ RogueSpear00:実際にはかなり簡単な修正。編集したコードを確認してください –

1

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

+2

あなたの答えはファイル名全体を返します。私は最後のセグメントを取得しようとしています、ファイル名の例の下で私が書いたものを見てください。 – RogueSpear00

+1

これを理解するには十分なはずです。 tsqlの文字列関数を参照してください –

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) 
関連する問題