と呼ばれる SQL Server の文書化されていない拡張ストアド プロシージャがありxp_dirtree
、すべてのファイルとフォルダ名 (サブフォルダを含む) をテーブル形式で返すことができます。再帰 CTE の理解を深めるために、これを使用して、指定したフォルダー (サブフォルダーを含む) 内のすべてのファイルの完全なパスを取得することにしました。しかし、1時間頭を悩ませた後でも、正しい方法がわかりません。次のコードは、私が現在持っているものです。この目的は再帰的 CTE で実装できますか?
DECLARE @dir NVARCHAR(260) ;
SELECT @dir = N'c:\temp' ;
IF RIGHT(@dir, 1) <> '\'
SELECT @dir = @dir + '\' ;
IF OBJECT_ID('tempdb..#dirtree', 'U') IS NOT NULL
DROP TABLE #dirtree ;
CREATE TABLE #dirtree
(
id INT PRIMARY KEY
IDENTITY,
subdirectory NVARCHAR(260),
depth INT,
is_file BIT
) ;
INSERT INTO #dirtree
EXEC xp_dirtree
@dir,
0,
1 ;
SELECT *
FROM #dirtree ;
WITH files
AS (
SELECT id,
subdirectory,
depth,
is_file, subdirectory AS path
FROM #dirtree
WHERE is_file = 1
AND depth <> 1
UNION ALL
-- ...
)
SELECT *
FROM files ;
xp_dirtree の出力が次のようになっているとします。
/*
id subdirectory depth is_file
--- -------------- ------- -------
1 abc.mdf 1 1
2 a 1 0
3 a.txt 2 1
4 b.txt 2 1
5 a.rb 1 1
6 aaa.flv 1 1
*/
私が欲しいのは:
/*
path
------------------
c:\temp\abc.mdf
c:\temp\a\a.txt
c:\temp\a\b.txt
c:\temp\a.rb
c:\temp\aaa.flv
*/