如何在SQL Server中将一个列值拆分为2个独立的列?
问题描述:
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
答
你需要的是提取功能文件名来自tsql中的路径。这不存在,但有一个“反向技巧”来获得lastindexof
将找到最后一个反斜杠,连接SUBSTRING
函数。这已经有一个解决方案在这里:https://*.com/a/19505918/1132334和更多这里:Is there a LastIndexOf in SQL Server?
答
我个人不会使用上面的链接引用的标量函数,因为标量函数减慢了事情。内联表值函数(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,'\');
答
尝试下面的代码
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
真棒。它的工作很好。谢谢Fadlallah。 – SNR
如果有效。将这个答案标记为正确,以便在搜索时帮助其他人,并且不回答你的问题 – Hadi