提取物理位置的一部分

时间:2019-02-13 09:48:55

标签: tsql substring

我需要从文件的完整物理位置提取备份位置的挂载点。

因此对于文件位置X:\Backup\Vol1\MSSQL\XYZ\XYZ.bak,我只需要X:\Backup\Vol1作为结果。

所以基本上我希望结果到第三个反斜杠。

2 个答案:

答案 0 :(得分:0)

我们可以尝试将对CHARINDEX的一系列调用链接在一起,这些调用可以从路径的开头识别出第三个路径分隔符:

SELECT
LEFT(path, CHARINDEX('\', path,
    CHARINDEX('\', path, CHARINDEX('\', path) + 1) + 1) - 1) AS out
FROM yourTable;

Demo

答案 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,从第二个字符开始。