2017-09-14 211 views
1

在SQL Server 2012中,我有以下工作代码来提取文件名和最低文件夹名。可以有任何级别的子文件夹 - 我只需要最内层的文件夹和文件名称。 SQL Server中有更容易阅读的方法吗?从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+'/'[email protected] 

回答

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 

如果这只是一个字符串n电火工品解析...

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

他们正试图解析字符串。没有指示文件夹甚至在服务器上。 –

+0

为字符串添加了一个版本。我不认为这是事实,因为你知道@MartinSmith,这已经被问过很多次了。感谢您向我指出 – scsimon

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

语法荧光笔最近似乎破了。 –

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 
相关问题