Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 如何从SQL Server 2008表中的完整路径获取文件夹和子文件夹列表_Sql Server 2008_Directory - Fatal编程技术网

Sql server 2008 如何从SQL Server 2008表中的完整路径获取文件夹和子文件夹列表

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

我的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('/', (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,但我们只需要文件夹和子文件夹。这非常有用!非常感谢。