2016-12-08 6 views
1

성공적으로 완료된 파일 이름을 추출하려고 시도하고 자체 파일 열의 각 파일 경로 대상을 추출하려고합니다.하위 문자열을 사용하여 파일 경로 추출

예제 파일 경로 : MPS : //Global/Test/Health/Reports/file.html

예상 결과 (네 개의 개별 열의) :

File.html Reports Health Test Global 

내 실제 결과 (두 열) :

File.html mps://Global/Test/Health/Reports 

내 쿼리 :

select 
RIGHT(filepath, CHARINDEX('/', REVERSE(filepath)) -1) AS ReportName 
LEFT(filepath,LEN(filepath) - charindex('/',reverse(filepath),1) + 1) AS ReportPath, 
from LOG; 

저는 각각의 '/'사이의 각 경로를 각각의 열에서 어떻게 추출 할 수 있는지 알아 내려고했습니다. 나는 네 개의 분리 된 컬럼에 대해 많은 charindex 변경을 실험했지만 스트링의 왼쪽과 오른쪽을 제거하는 데 문제가있다. 어떤 아이디어?

+0

동적이어야합니까? 경로가'//global/test/health/somemore/somemore/somemore/somemore/file.html'처럼 길 수 있습니까? – SQLChao

+0

그래, 네가 할 수있는 부분은 네 단락으로 돌아가고 싶기 때문이다. – lnjblue

+0

Ok. 10을 말할지라도 4 섹션 만 원하십니까? – SQLChao

답변

1

XML로 변환 한 후 "노드"를 타겟팅하십시오.

declare @yak varchar(100) = 'mps://Global/Test/Health/Reports/file.html'; 

declare @x xml = cast('<r><i>' + replace(replace(@yak, 'mps://', ''), '/', '</i><i>') + '</i></r>' as xml); 

select [Col1] = r.n.value('i[1]', 'varchar(100)'), 
     [Col2] = r.n.value('i[2]', 'varchar(100)'), 
     [Col3] = r.n.value('i[3]', 'varchar(100)'), 
     [Col4] = r.n.value('i[4]', 'varchar(100)'), 
     [Col5] = r.n.value('i[5]', 'varchar(100)'), 
     [Col6] = r.n.value('i[6]', 'varchar(100)') 
from @x.nodes('r')r(n); 

반환 값 :

Col1 Col2 Col3 Col4 Col5  Col6 
---- ---- ---- ---- ----  ---- 
Global Test Health Reports file.html NULL 
0

난 당신이 string_split 기능을 할 수 있습니다 생각합니다. ISTR은 특히 파일 이름을 4 부분 (드라이브, 디렉토리, 기본, 확장자)으로 구문 분석하는 기능이지만 C 런타임 라이브러리에있을 수 있습니다.

0

특히 파일 경로 중 일부가 null 인 경우 charindex 내부에 대소 문자를 사용하는 것이 좋습니다.