2017-07-25 6 views
1

ich mit einer SQL-Tabelle haben, die Datensätze enthält, die hierarchisch organisiert sind wie folgt:Ordnerstruktur im Batchverfahren erstellen SQL-Skript Ausgabe

ID Item OtherColumns ParentID 
1 a  blah   NULL 
2 b  blah   1 
3 c  blah   2 
4 d  blah   3 
5 e  blah   3 
6 f  blah   3 
7 g  blah   4 
8 h  blah   4 
9 i  blah   4 
10 j  blah   4 
11 k  blah   6 
12 l  blah   6 
13 m  blah   6 
14 n  blah   6 

Grafisch ist die Hierarchie

a 
--b 
----c 
-------d 
----------g 
----------h 
----------i 
----------j 
-------e 
-------f 
----------k 
----------l 
----------m 
----------n 

Ich habe eine SQL Skript, das einen ParentID-Parameter akzeptiert und alle untergeordneten Elemente für diesen Knoten zurückgibt.

Ich nenne das Skript aus einer rekursiven Funktion in einer Batch-Datei und drucken Sie die Elemente in der Reihenfolge ihrer Struktur, aber ich bin mir nicht sicher, wie ich eine Ordnerstruktur erstellen, die dieser Spiegel

Meine Charge

@echo off 
setlocal enabledelayedexpansion 

set Id=1 
call :CreateSubDirectories !Id! 1 

goto eof 

:CreateSubDirectories 

    for /f "tokens=1,2,*" %%i IN ('sqlcmd -S MyServer\MyInstance -d myDatabase -U myUser -P myPassword -i C:\Path\to\my\script.sql -v parentId^=%~1! -h -1') DO (
     echo %%i 
     call :CreateSubDirectories %%i 
    ) 

:eof 

endlocal 

so druckt diese aus

a 
b 
c 
d 
g 
h 
i 
j 
e 
f 
k 
l 
m 
n 

aber wenn ich eine mkdir meiner Schleife hinzuzufügen war, alle Ordner auf dem gleichen Niveau schaffen würde. Wie kann ich damit die oben dargestellte Ordnerstruktur erstellen?

+0

haben Sie einige CTE Code gibt bereits? – gbn

+0

Ja, das SQL-Skript hat einen rekursiven CTE – SEarle1986

Antwort

1

Führen Sie das mkdir gegen einen CTE Ausgang

DECLARE @foo TABLE 
(ID int, Item varchar(100), OtherColumns varchar(20), ParentID int) 

INSERT @foo VALUES 
(1 ,'a', 'blah', NULL), 
(2 ,'b', 'blah', 1 ), 
(3 ,'c', 'blah', 2 ), 
(4 ,'d', 'blah', 3 ), 
(5 ,'e', 'blah', 3 ), 
(6 ,'f', 'blah', 3 ), 
(7 ,'g', 'blah', 4 ), 
(8 ,'h', 'blah', 4 ), 
(9 ,'i', 'blah', 4 ), 
(10 ,'j', 'blah', 4 ), 
(11 ,'k', 'blah', 6 ), 
(12 ,'l', 'blah', 6 ), 
(13 ,'m', 'blah', 6 ), 
(14 ,'n', 'blah', 6 ); 

WITH Hierarchy AS 
(
    SELECT ID, FolderPath = Item, OtherColumns, ParentID, 1 AS Level FROM @foo WHERE ParentID IS NULL 
    UNION ALL 
    SELECT [@foo].ID, 
      LEFT(CONCAT(Hierarchy.FolderPath, '\', [@foo].Item), 100), 
      [@foo].OtherColumns, 
      [@foo].ParentID, 
      Level + 1 
    FROM 
     Hierarchy JOIN @foo ON [@foo].ParentID = Hierarchy.ID 

) 
SELECT FolderPath FROM Hierarchy ORDER BY Hierarchy.Level; 

a 
a\b 
a\b\c 
a\b\c\d 
a\b\c\e 
a\b\c\f 
a\b\c\f\k 
a\b\c\f\l 
a\b\c\f\m 
a\b\c\f\n 
a\b\c\d\g 
a\b\c\d\h 
a\b\c\d\i 
a\b\c\d\j 
+0

Perfekt, danke! – SEarle1986

Verwandte Themen