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

如何將輸出文件路徑分成兩部分?如何在SQL Server中將一個列值拆分爲2個獨立的列?

例如:

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

我個人不會使用上面的鏈接引用的標量函數,因爲標量函數減慢了事情。內聯表值函數(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