Я лично не использовал бы скалярные функции, указанные в ссылке выше, потому что скалярные функции замедляют работу. Функции Inline Table Values (itvf) - это путь. В этом случае это не имеет большого значения, потому что вы, вероятно, не имеете дело со многими строками, но для высокопроизводительной альтернативы скалярным UDF смотрите эту статью: http://www.sqlservercentral.com/articles/T-SQL/91724/.
Для sys.database_files вы можете просто сделать это:
WITH prep AS
(
SELECT physical_name, li = LEN(physical_name)-CHARINDEX('\',REVERSE(physical_name))
FROM sys.database_files
)
SELECT fpath = SUBSTRING(physical_name,1,li), fname = SUBSTRING(physical_name,li+2,8000)
FROM prep;
Вот многоразовой альтернативой скалярных UDF, для такого рода вещь:
-- A high-performing, re-usable itvf to split a string on the last delimiter.
CREATE FUNCTION dbo.itvf_getfilename (@fullname varchar(255), @delimiter char(1))
RETURNS TABLE AS RETURN
SELECT fpath = SUBSTRING(@fullname,1,li),
fname = SUBSTRING(@fullname,li+2,8000)
FROM (VALUES (LEN(@fullname) - CHARINDEX('\',REVERSE(@fullname)))) prep(li);
Вот пример использования:
DECLARE @fullname varchar(255) = 'C:\Program Files\Microsoft SQL Server\MSSQL12.SQLSERVER2014X64\MSSQL\DATA AjbTest.mdf';
SELECT fpath, fname FROM dbo.itvf_getfilename (@fullname,'\');
... и, против стола:
SELECT fpath, fname
FROM sys.database_files dbf
CROSS APPLY dbo.itvf_getfilename(dbf.physical_name,'\');
Высокий. Его работала отлично. Спасибо Fadlallah. – SNR
Если это сработало. Отметьте этот ответ как правильный, чтобы помочь другим людям при поиске и не оставлять ур без ответа – Hadi