1

SQL Server テーブルにファイル パス (フォルダーとサブフォルダーを含む) を含む列があります。

例えば:

/Hidden Reporting/Validation Report
/Top Reporting/Inner/TopTools Report

現在、これらのパスのすべてのメイン フォルダーを返すクエリがあります。

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
Top Reporting
Inner

SQL Server 2008 でそれを行うにはどうすればよいですか?

4

1 に答える 1

2

まず、文字列を分割するテーブル値関数を作成します。以下の関数を他の場所から分割しました

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 part
FROM Catalogs C 
cross APPLY dbo.SplitString( substring([Path],1,LEN([Path]) - 
 CHARINDEX('/',REVERSE([Path]))) ,'/') AS Results
WHERE ISNULL(part,'') <> ''  
于 2012-07-13T10:41:43.033 に答える