Sql server 2008 如何从SQL Server 2008表中的完整路径获取文件夹和子文件夹列表
我的SQL Server表中有一列包含文件路径(包含文件夹和子文件夹) 例如:Sql server 2008 如何从SQL Server 2008表中的完整路径获取文件夹和子文件夹列表,sql-server-2008,directory,Sql Server 2008,Directory,我的SQL Server表中有一列包含文件路径(包含文件夹和子文件夹) 例如: /Hidden Reporting/Validation Report /Top Reporting/Inner/TopTools Report Hidden Reporting Top Reporting Inner 我当前有一个查询,返回以下路径的所有主文件夹: Select Distinct LEFT((substring(Path, 2, (LEN(Path) - 1))), CHARINDEX
/Hidden Reporting/Validation Report
/Top Reporting/Inner/TopTools Report
Hidden Reporting
Top Reporting
Inner
我当前有一个查询,返回以下路径的所有主文件夹:
Select Distinct
LEFT((substring(Path, 2, (LEN(Path) - 1))), CHARINDEX('/', (substring(Path, 2,(LEN(Path) - 1)))) - 1) AS Folder
FROM dbo.Catalogs
Where Type=2
结果:
Hidden Reporting
Top Reporting
但我也需要得到子文件夹
例如:
/Hidden Reporting/Validation Report
/Top Reporting/Inner/TopTools Report
Hidden Reporting
Top Reporting
Inner
如何在SQL Server 2008中执行此操作?首先创建一个表值函数来拆分字符串。我得到了下面的函数从其他地方分离出来
create FUNCTION [dbo].[SplitString]
(
@sString varchar(5000),
@cDelimiter char(1)
)
RETURNS @tParts TABLE ( part varchar(5000) )
AS
BEGIN
if @sString is null return
declare @iStart int,
@iPos int
if substring( @sString, 1, 1 ) = @cDelimiter
begin
set @iStart = 2
insert into @tParts
values( null )
end
else
set @iStart = 1
while 1=1
begin
set @iPos = charindex( @cDelimiter, @sString, @iStart )
if @iPos = 0
set @iPos = len( @sString )+1
if @iPos - @iStart > 0
insert into @tParts
values ( substring( @sString, @iStart, @iPos-@iStart ))
else
insert into @tParts
values( null )
set @iStart = @iPos+1
if @iStart > len( @sString )
break
end
RETURN
END
现在,您可以执行下面的select查询以获得所需的输出
SELECT part
FROM Catalogs C
cross APPLY dbo.SplitString( substring([Path],1,LEN([Path]) -
CHARINDEX('/',REVERSE([Path]))) ,'/') AS Results
WHERE ISNULL(part,'') <> ''
选择零件
从目录C
交叉应用dbo.SplitString(子字符串([Path],1,LEN([Path])-
CHARINDEX(“/”,REVERSE([Path]),“/”)作为结果
其中为空(部分“”)“”
这很好,但在本例中,我们有一个包含所有文件夹、子文件夹和文件名的列表。此路径的最后一部分是文件名(验证报告、TopTools报告)/因此路径的结构是:/Folder1/Folder2/FileName,但我们只需要文件夹和子文件夹。这非常有用!非常感谢。