注册 登录
编程论坛 SQL Server论坛

[转载]挑战所有SQLServer版的SQL水平贴

━╋网情深★ 发布于 2006-10-24 17:05, 1364 次点击

标题:不用其它语言脚本,用SQL得到服务器上文件路径!!


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

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
。。。。。


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

11 回复
#2
━╋网情深★2006-10-24 17:46
没人知道吗?
#3
bob77892006-10-25 11:26
那楼主是出题考我们吧!~



贴出答案来我们学习,学习!~~
#4
━╋网情深★2006-10-26 13:31

我在别的论坛看到的,我有份答案,可是你们就不能答答吗?难道这个论坛就没有高手吗?

#5
LouisXIV2006-10-26 16:39
解决的关键应该在于Openrowset语句的应用

至于递归循环出上级目录不是什么很复杂的东西,做ERP什么应该都用到过类似的语句
#6
━╋网情深★2006-10-27 19:33
Openrowset???
也没人回答,唉。。。。
还是把答案帖出来吧!
#7
mydream2006-11-03 10:56

楼主把答案贴出来吧

#8
━╋网情深★2006-11-13 11:49

DECLARE @Path nvarchar(260)
SET @Path = 'D:\新建文件夹'

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 #

#9
━╋网情深★2006-11-13 11:50
绝对精华
#10
━╋网情深★2006-11-13 16:47
没人顶吗?
#11
小水滴2006-11-14 09:21
谢谢!学习了.

只是我又想到一个问题,如果有一个目录很大,第一次我把该目录下的文件和目录都读到了表里,然后我又向该目录中增加了很多文件或目录,如果全部重新读一遍又要花很多时间,我能不能只读出那些新加进去的文件或目录的路径呢,楼主可有办法?
#12
CrazyWeed09072006-11-14 10:58
1