现在的位置: 首页 > 综合 > 正文

SQL里,怎样通过递归得到某个文件目录下的全部文件名[含子目录]?

2013年09月28日 ⁄ 综合 ⁄ 共 889字 ⁄ 字号 评论关闭

已知这个存储过程可以把文件名和路径读出

exec master..xp_dirtree @path='D:/目录',@depth=0,@file=1--参数:目录名,目录深度,是否显示文件

现在想得到'D:/笨狼代码收藏集'目录下的全部深度的文件路径[含子目录],如下表:

id[编号]              dir [全部文件全路径]

1D:/笨狼代码收藏集/根目录下文件1.txt
2D:/笨狼代码收藏集/算法/算法目录下文件1.txt
3D:/笨狼代码收藏集/算法/算法目录下文件2.txt
4D:/笨狼代码收藏集/其他/其他目录下文件1.txt
5D:/笨狼代码收藏集/其他/xml/xml目录下文件1.txt
。。。。。

可以用递归和非递归,方法不限。 

 

邹老大解:

DECLARE @Path nvarchar(260)
SET @Path = 'f:/'

IF RIGHT(@Path, 1) <> '/'
SET @Path = @Path + '/'
IF OBJECT_ID('tempdb..#') IS NOT NULL
DROP TABLE #
CREATE TABLE #(
id int IDENTITY,
directory nvarchar(260),
depth int,
IsFile bit)
INSERT # EXEC master.dbo.xp_dirtree
@path = @path,
@depth = 0,
@file = 1

DECLARE @depth int, @depthMax int
UPDATE # SET
directory = @Path + directory
WHERE depth = 1
SELECT
@depth = 2,
@depthMax = MAX(depth)
FROM #
WHILE @depth <= @depthMax
BEGIN
UPDATE A SET
directory = (
SELECT TOP 1
directory
FROM #
WHERE depth = @depth - 1
AND IsFile = 0
AND id < A.id
ORDER BY id DESC
) + N'/' + directory
FROM # A
WHERE depth = @depth
SET @depth= @depth + 1
END
SELECT * FROM #

抱歉!评论已关闭.