SQL脚本问题:无法正确提取文件路径最后一个\之前的内容
SQL脚本提取文件路径父目录的问题分析
你的脚本核心问题是逻辑计算错误,导致截取的长度完全不符合需求:
原脚本中 CHARINDEX('\', REVERSE(@FullPath)) 获取的是反转后第一个反斜杠的位置,这个值其实是原路径中最后一个反斜杠到文件名末尾的总长度(包括反斜杠本身)。你直接用这个值减1后作为LEFT的截取长度,相当于只取了原路径的前「文件名长度-1」个字符,自然只能得到部分内容。
举个直观例子:原路径最后一段是\7783456_p0000.tif,反转后是fit.0000_p6543877\,CHARINDEX得到的是14(文件名13位+反斜杠1位),你用14-1=13作为LEFT的长度,只会截取原路径前13个字符,结果显然不对。
修正后的脚本
要正确提取最后一个反斜杠之前的内容,应该用原路径的总长度减去「最后一个反斜杠到末尾的长度」,再进行截取:
DECLARE @FullPath VARCHAR(500) SET @FullPath = 'C:\test\test1\V1000\20\7783456\7783456_p0000.tif' -- 方法1:使用LEFT结合总长度计算 SELECT LEFT(@FullPath, LEN(@FullPath) - CHARINDEX('\', REVERSE(@FullPath))) -- 方法2:用SUBSTRING更直观 SELECT SUBSTRING(@FullPath, 1, LEN(@FullPath) - CHARINDEX('\', REVERSE(@FullPath)))
额外说明
- 如果路径可能包含Unicode字符,建议把
VARCHAR换成NVARCHAR; - 如果路径末尾可能存在多余的反斜杠,需要先通过
REPLACE或TRIM清理后再计算。
内容的提问来源于stack exchange,提问作者Jyina
相关产品推荐
相关产品推荐

