Sql server 使用T-SQL生成基于目录的目录和文件列表

Sql server 使用T-SQL生成基于目录的目录和文件列表,sql-server,tsql,Sql Server,Tsql,我在sql server中有一个存储为路径的大量文件列表。将路径分解为目录很容易,但是,我需要能够一次在一个级别上显示所有文件和文件夹的列表。SQL Server有一些内置实用程序来处理服务器本地文件的这种情况,但它们不适用于这种情况 使用通配符将返回当前目录下的所有内容,因此我放弃了它 数据: 理想情况下,我希望传入一个文件夹,并查看该级别的所有文件和文件夹。然后我可以在treegrid控件中表示,但这部分超出了问题的范围 传入“C:\test\”应返回: C:\test\file.txt C

我在sql server中有一个存储为路径的大量文件列表。将路径分解为目录很容易,但是,我需要能够一次在一个级别上显示所有文件和文件夹的列表。SQL Server有一些内置实用程序来处理服务器本地文件的这种情况,但它们不适用于这种情况

使用通配符将返回当前目录下的所有内容,因此我放弃了它

数据:

理想情况下,我希望传入一个文件夹,并查看该级别的所有文件和文件夹。然后我可以在treegrid控件中表示,但这部分超出了问题的范围

传入“C:\test\”应返回:

C:\test\file.txt
C:\test\level2
C:\test\level3
希望这有帮助

DECLARE @SearchDir VARCHAR(4000) 
SET @SearchDir = 'C:\test\' 

;WITH cte_TestData(Directory) AS
(
SELECT 'C:\test\file.txt' UNION ALL
SELECT 'C:\test2\file.txt' UNION ALL
SELECT 'C:\test\level2\bc.txt' UNION ALL
SELECT 'C:\test\level3\another.txt' UNION ALL
SELECT 'C:\test\level1\level2\bc.txt' UNION ALL
SELECT 'C:\test\level1\level2\level3\another.txt'
)
SELECT CASE 
        WHEN CHARINDEX('\', REPLACE(Directory, @SearchDir, '')) > 0
            THEN @SearchDir + LEFT(REPLACE(Directory, @SearchDir, ''), CHARINDEX('\', REPLACE(Directory, @SearchDir, '')) - 1)
        ELSE @SearchDir + REPLACE(Directory, @SearchDir, '')
        END
FROM cte_TestData
WHERE CHARINDEX(@SearchDir, Directory) > 0
    AND LEN(REPLACE(Directory, @SearchDir, '')) - LEN(REPLACE(REPLACE(Directory, @SearchDir, ''), '\', '')) <= 1

类似于古里的解决方案

DECLARE @SearchDir VARCHAR(4000) 
SET @SearchDir = 'C:\test\' 

;WITH cte_TestData(Directory) AS
(
SELECT 'C:\test\file.txt' UNION ALL
SELECT 'C:\test2\file.txt' UNION ALL
SELECT 'C:\test\level2\bc.txt' UNION ALL
SELECT 'C:\test\level3\another.txt' UNION ALL
SELECT 'C:\test\level1\level2\bc.txt' UNION ALL
SELECT 'C:\test\level1\level2\level3\another.txt'
)
SELECT * FROM cte_TestData
WHERE PATINDEX('%\%',REPLACE(Directory,@SearchDir,'')) = 0 --remove the @searchDir filter and what remains shouldnt containa backslash
这就成功了。OrderBy包括在文件夹名称之前输出文件名。如果你不在乎订单,你可以放弃它和ORDERBY条款


从datatable中选择文件名,其中类似于“C:\test\%”的文件名?类似于@Path+'%”的文件名和不类似于@Path+'%\%”的文件名,即所需级别但不更深的所有内容都将获取文件,但不会获取文件夹。你可以联合一个类似的查询来获得文件夹。哈波-谢谢,这让我接近了!现在只需要弄清楚如何获取目录。像@Path+“%\%”这样的文件名和不像@Path+“%\%\%”这样的文件名将进入下一个级别,但不会更深。从上一个\on中删除所有内容,您拥有的是文件夹。相反,查林德斯,莱恩和左,结合一点算术,应该可以做到。如果你使用union,而不是UNIONALL,重复项将被消除。夜间思考:重复项只需要删除文件夹,希望不是文件。在文件夹查询中使用distinct和union all组合结果应该更有效。仍在使用此代码-仅当文件夹下有文件目录时,它才会返回文件夹。如果有一个再向下一级的文件夹,但没有文件,则不会返回任何内容。您的意思是,如果搜索“C:\foo\”并且有一个匹配的空目录,则不会输出该目录吗?如果表中有“C:\foo\”和后面的反向索利多金币\,则会选择它C:\foo’显然是根文件夹中没有类型的文件,而不是文件夹。
DECLARE @SearchDir VARCHAR(4000) 
SET @SearchDir = 'C:\test\' 

;WITH cte_TestData(Directory) AS
(
SELECT 'C:\test\file.txt' UNION ALL
SELECT 'C:\test2\file.txt' UNION ALL
SELECT 'C:\test\level2\bc.txt' UNION ALL
SELECT 'C:\test\level3\another.txt' UNION ALL
SELECT 'C:\test\level1\level2\bc.txt' UNION ALL
SELECT 'C:\test\level1\level2\level3\another.txt'
)
SELECT * FROM cte_TestData
WHERE PATINDEX('%\%',REPLACE(Directory,@SearchDir,'')) = 0 --remove the @searchDir filter and what remains shouldnt containa backslash
-- Sample data.
declare @Filenames as Table ( Filename VarChar(128) );
insert into @Filenames ( Filename ) values
  ( 'C:\test\file.txt' ), ( 'C:\test\level2\file.txt' ),
  ( 'C:\test\level2\bc.txt' ), ( 'C:\test\level3\another.txt' ),
  ( 'C:\test\level3\deeper\nothing.txt' );
select * from @Filenames;

declare @Path as VarChar(128) = 'C:\test\';

-- Get the files.
--   Filename longer than   @Path , but not containing an additional reverse solidus ('\').
select Filename, 1 as OrderBy
  from @Filenames
  where Filename like @Path + '%' and Filename not like @Path + '%\%'
union
-- Get the directories.
--   Filename longer than   @Path   and containing one additional reverse solidus ('\').
--   Locate the reverse solidus after the length of   @Path   and trim from that point onwards.
--   Since there may be many files in each folder, use   distinct   to get each folder once.
select distinct SubString( Filename, 1, CharIndex( '\', Filename, Len( @Path ) + 1 ) - 1 ), 2
  from @Filenames
  where Filename like @Path + '%\%' and Filename not like @Path + '%\%\%'
order by OrderBy, Filename;