我在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
答案 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