我需要从文件的完整物理位置提取备份位置的挂载点。
因此对于文件位置X:\Backup\Vol1\MSSQL\XYZ\XYZ.bak
,我只需要X:\Backup\Vol1
作为结果。
所以基本上我希望结果到第三个反斜杠。
答案 0 :(得分:0)
我们可以尝试将对CHARINDEX
的一系列调用链接在一起,这些调用可以从路径的开头识别出第三个路径分隔符:
SELECT
LEFT(path, CHARINDEX('\', path,
CHARINDEX('\', path, CHARINDEX('\', path) + 1) + 1) - 1) AS out
FROM yourTable;
答案 1 :(得分:0)
这将使您能够追溯到动态水平
DECLARE @YourPath VARCHAR(1000)='X:\Backup\Vol1\MSSQL\XYZ\XYZ.bak';
DECLARE @level INT=3;
SELECT CAST('<x>' + REPLACE(@YourPath,'\','</x><x>') + '</x>' AS XML)
.query(N'
for $fragment in /x[position()<=sql:variable("@level")]
return <y>{concat("\",$fragment)}</y>
').value('substring(.,2,1000)','nvarchar(1000)');
查询会将您的路径转换为
之类的XML<x>X:</x>
<x>Backup</x>
<x>Vol1</x>
<x>MSSQL</x>
<x>XYZ</x>
<x>XYZ.bak</x>
XQuery
将选择位置为<=sql:variable("@level")
的所有元素,并以前导\
返回它们,从而导致
<y>\X:</y>
<y>\Backup</y>
<y>\Vol1</y>
最后的.value()
将立即带回所有(由于XPath "."
)。
\X:\Backup\Vol1
要摆脱开头的\
,我使用substring
,从第二个字符开始。