从SQL Server中的完整文件名获取最后一个文件夹和文件名

时间:2017-09-14 18:43:03

标签: sql-server tsql plsql

我在SQL Server 2012中有以下工作代码来提取文件名以及最低文件夹名。可以有任何级别的子文件夹 - 我只需要最里面的文件夹和文件名。在SQL Server中是否有更容易阅读的方法呢?

预期结果

MySubFolder/MyFile_4.0_20170901031307_2697.zip

当前工作SQL

DECLARE @FileName varchar(200) =  'D:\SourceFiles\MyFolder\MySubFolder\MyFile_4.0_20170901031307_2697.zip'
DECLARE @TotalRecords INT
DECLARE @SectionName VARCHAR(128)
DECLARE @FileOnly VARCHAR(128)

SET @FileName = REPLACE( @FileName, '/', '\')
DECLARE @xml xml = '<r><n>' + REPLACE( @FileName, '\', '</n><n>') + '</n></r>'

DECLARE @FoldersList TABLE(FId INT IDENTITY(1,1), FolderOrFileName VARCHAR(128))
INSERT INTO @FoldersList (FolderOrFileName)
SELECT n.value( '.', 'varchar(200)') 
FROM @xml.nodes('r/n') n(n)


SELECT @TotalRecords = COUNT(*) FROM @FoldersList
SELECT @SectionName = FolderOrFileName FROM @FoldersList WHERE Fid = (@TotalRecords - 1)
SELECT @FileOnly = FolderOrFileName FROM @FoldersList WHERE Fid = (@TotalRecords)

SELECT @SectionName+'/'+@FileOnly

3 个答案:

答案 0 :(得分:1)

您可以使用xp_diretree查看深度,如果它是文件或文件夹......

DECLARE @FileName varchar(200) =  'D:\SourceFiles\MyFolder\MySubFolder\

IF OBJECT_ID('tempdb..#FileNames') IS NOT NULL DROP TABLE #ProductivityFileNames
CREATE TABLE #FileNames (
    id int IDENTITY(1,1)
    ,subdirectory nvarchar(512)
    ,depth int
    ,isfile bit)
INSERT #FileNames (subdirectory,depth,isfile)
EXEC xp_dirtree @FileName 

SELECT * 
FROM 
   #FileNames
WHERE 
      (depth = (select max(depth) - 1 from #FileNames) and isFile = 0) --limit to the last sub-folder
   or (depth = (select max(depth) from #FileNames) and isFile = 1)     --this would be the files in the deepest folder

如果这只是一个需要解析的字符串......

DECLARE @FileName varchar(200) =  'D:\SourceFiles\MyFolder\MySubFolder\MyFile_4.0_20170901031307_2697.zip'

select right(@FileName,CHARINDEX('\',reverse(@FileName),CHARINDEX('\',reverse(@FileName)) + 1) - 1)

答案 1 :(得分:1)

您可以使用

DECLARE @FileName varchar(200) = 
  'D:\SourceFiles\MyFolder\MySubFolder\MyFile_4.0_20170901031307_2697.zip'

SELECT RIGHT(@FileName, CHARINDEX('\', FileNameRev, 1+ CHARINDEX('\', FileNameRev)) - 1) 
FROM (SELECT REVERSE('\' + @FileName)) V(FileNameRev)

答案 2 :(得分:1)

另一种选择。

如果路径在表格中,则很容易转换为CROSS APPLY。

示例

DECLARE @FileName varchar(200) =  'D:\SourceFiles\MyFolder\MySubFolder\MyFile_4.0_20170901031307_2697.zip'

Select reverse(concat(xDim.value('/x[1]','varchar(max)'),'\',xDim.value('/x[2]','varchar(max)')))
 From  (Select Cast('<x>' + replace(reverse(@FileName),'\','</x><x>')+'</x>' as xml) as xDim) as A 

<强>返回

MySubFolder\MyFile_4.0_20170901031307_2697.zip

如果表

示例

Declare @YourTable table (ID int, FileName varchar(max))
Insert Into @YourTable values
 (1,'D:\SourceFiles\MyFolder\MySubFolder\MyFile_4.0_20170901031307_2697.zip')
,(2,'D:\MyFile_4.0.zip')


Select A.ID
      ,B.*
 From  @YourTable A
 Cross Apply (
                Select ShortPath = reverse(concat(xDim.value('/x[1]','varchar(max)'),'\',xDim.value('/x[2]','varchar(max)')))
                 From  (Select Cast('<x>' + replace(reverse(A.FileName),'\','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B

<强>返回

ID  ShortPath
1   MySubFolder\MyFile_4.0_20170901031307_2697.zip
2   D:\MyFile_4.0.zip