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