2016-10-22 2 views
0
Select physical_name 
From Sys.database_files 

Как разбить путь к файлу на 2 части?Как разбить одно значение столбца на 2 отдельных столбца в SQL Server?

Например:

Select physical_name 
From Sys.database_files 

производит этот выход:

C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\master.mdf 
C:\Program Files\MSSQL\DATA\muser.mdf 

, который я хотел бы, чтобы изменить:

Col1                 col2 
---------------------------------------------------------------------------------- 
C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA master.mdf 
C:\Program Files\MSSQL\DATA           muser.mdf 

ответ

0

Что вам нужно, это функция для извлечения имя файла из пути в tsql. Этого не существует, но есть «обратный трюк», чтобы получить lastindexof, который найдет последнюю обратную косую черту в связи с функцией SUBSTRING. Это уже имеет решение здесь: https://stackoverflow.com/a/19505918/1132334 и еще здесь: Is there a LastIndexOf in SQL Server?

0

Я лично не использовал бы скалярные функции, указанные в ссылке выше, потому что скалярные функции замедляют работу. Функции 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,'\'); 
0

попробовать Следующий код

Select physical_name AS [FullPath] , 
LEFT(physical_name,LEN(physical_name) - charindex('\',reverse(physical_name),1) + 1) [Directory], 
REVERSE(LEFT(REVERSE(physical_name),CHARINDEX('\', REVERSE(physical_name), 1) - 1)) [Filename] 
From Sys.database_files 
+0

Высокий. Его работала отлично. Спасибо Fadlallah. – SNR

+0

Если это сработало. Отметьте этот ответ как правильный, чтобы помочь другим людям при поиске и не оставлять ур без ответа – Hadi

Смежные вопросы